@bongos/core 1.19.919 → 1.19.921

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.bongos-core.json +73 -53
  2. package/.claude/skills/grade-audit/SKILL.md +9 -0
  3. package/docs/adr/0320-an-empty-diff-is-not-an-ungraded-diff.md +159 -0
  4. package/docs/adr/README.md +1 -0
  5. package/docs/module-api-changelog.md +4 -0
  6. package/modules/grading/grader-no-artifact.js +347 -0
  7. package/modules/grading/grader.js +6 -0
  8. package/modules/hall-ui/public/atlas.html +1 -1
  9. package/modules/hall-ui/public/blockers.html +1 -1
  10. package/modules/hall-ui/public/board-room.html +1 -1
  11. package/modules/hall-ui/public/collab.html +1 -1
  12. package/modules/hall-ui/public/copy-desk.html +1 -1
  13. package/modules/hall-ui/public/deploy.html +1 -1
  14. package/modules/hall-ui/public/diagrams.html +1 -1
  15. package/modules/hall-ui/public/drachmae.html +1 -1
  16. package/modules/hall-ui/public/gate.html +1 -1
  17. package/modules/hall-ui/public/goals.html +1 -1
  18. package/modules/hall-ui/public/government.html +1 -1
  19. package/modules/hall-ui/public/idea.html +1 -1
  20. package/modules/hall-ui/public/ideas.html +1 -1
  21. package/modules/hall-ui/public/index.html +1 -1
  22. package/modules/hall-ui/public/modules.html +1 -1
  23. package/modules/hall-ui/public/people.html +1 -1
  24. package/modules/hall-ui/public/primer.html +1 -1
  25. package/modules/hall-ui/public/profile.html +1 -1
  26. package/modules/hall-ui/public/project-settings.html +1 -1
  27. package/modules/hall-ui/public/ranks.html +1 -1
  28. package/modules/hall-ui/public/roadmap.html +1 -1
  29. package/modules/hall-ui/public/roster.html +1 -1
  30. package/modules/hall-ui/public/sessions.html +1 -1
  31. package/modules/hall-ui/public/settings.html +1 -1
  32. package/modules/hall-ui/public/studio.html +1 -1
  33. package/modules/hall-ui/public/task.html +1 -1
  34. package/modules/hall-ui/public/watch.html +1 -1
  35. package/modules/hall-ui/public/work.html +1 -1
  36. package/package-lock.json +2 -2
  37. package/package.json +1 -1
  38. package/scripts/gds/run-unit-tests.js +17 -1
  39. package/scripts/gds/ship-flow.js +54 -7
  40. package/scripts/gds/ship-grade-steps.js +43 -5
  41. package/scripts/gds/ship-grade.js +36 -0
  42. package/src/bongos/routes/me.js +9 -1
  43. package/src/module-api.js +1 -1
  44. package/tests/core_update_banner.mjs +28 -0
  45. package/tests/git_merge_regen.mjs +87 -3
  46. package/tests/grader_no_artifact.mjs +360 -0
  47. package/tests/grader_prompt_fencing.mjs +46 -0
  48. package/tests/nav_permission_atoms.mjs +110 -0
  49. package/tests/no_artifact_escalation.mjs +13 -3
  50. package/tests/skip_is_not_pass.mjs +91 -1
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.919",
6
- "core_contract": "1.19.919",
7
- "source_commit": "bc2cae9667f75f9a2df301fc776a5e0b79451325",
5
+ "core_version": "1.19.921",
6
+ "core_contract": "1.19.921",
7
+ "source_commit": "b57a8de976b2d06f0400384b4c8bd5d1f0d69508",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-20T19:06:48.075Z",
9
+ "built_at": "2026-09-20T20:00:16.702Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 508,
12
+ "docs_redacted": 509,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2302,
14
+ "functional_verbatim": 2305,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2836,
20
- "tree_sha256": "fcb4d5d17d74106fc9ba7d49143956885bb9c5dadc48c2e1a3aa39ebcc76a851",
19
+ "file_count": 2840,
20
+ "tree_sha256": "9ea93825644aa4fadb711161dbfbf72e4a032f44e888e27c23fbf66d1a695b32",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -152,7 +152,7 @@
152
152
  {
153
153
  "path": ".claude/skills/grade-audit/SKILL.md",
154
154
  "mode": "0000644",
155
- "sha256": "5aa0804e6b4162f0dd0f5608e8a0964890e680e0f7cefe4fe2efdacc7ddbc340"
155
+ "sha256": "c32df53b87b71a15e6b6e605c0c9698a07ff99a94bc6325fd99648d9c2d38122"
156
156
  },
157
157
  {
158
158
  "path": ".claude/skills/grade-recover/SKILL.md",
@@ -2089,10 +2089,15 @@
2089
2089
  "mode": "0000644",
2090
2090
  "sha256": "2fbb3e040b55162284242f545af76b1254fafbecfe042b8c792dc0dca475c4f8"
2091
2091
  },
2092
+ {
2093
+ "path": "docs/adr/0320-an-empty-diff-is-not-an-ungraded-diff.md",
2094
+ "mode": "0000644",
2095
+ "sha256": "e582b4ece7a5b0acf4392d8b3d4942d55b52dc487d7c6a7c3a159203485ec633"
2096
+ },
2092
2097
  {
2093
2098
  "path": "docs/adr/README.md",
2094
2099
  "mode": "0000644",
2095
- "sha256": "087b5151c182476c1f541e239776099319ad7fa95e6ebc2dc5ccf2b320c84f0c"
2100
+ "sha256": "7f11cc3e7cf17031aae449f13724fe1c42350516e5294732b6db1eb6e3917673"
2096
2101
  },
2097
2102
  {
2098
2103
  "path": "docs/api-reference.md",
@@ -2662,7 +2667,7 @@
2662
2667
  {
2663
2668
  "path": "docs/module-api-changelog.md",
2664
2669
  "mode": "0000644",
2665
- "sha256": "e15b7bc78c0b64fc27725df643ec05f20e047322623ac182f3614fea341521bb"
2670
+ "sha256": "5693553f86384a3e66f0e6ba77ba1e6f83130a440d0a1f17179173b98696a026"
2666
2671
  },
2667
2672
  {
2668
2673
  "path": "docs/modules-contract.md",
@@ -4514,6 +4519,11 @@
4514
4519
  "mode": "0000644",
4515
4520
  "sha256": "597f883d4878a8fb585585331e11dc219e8a57d1459be4039116b60e7fdc556d"
4516
4521
  },
4522
+ {
4523
+ "path": "modules/grading/grader-no-artifact.js",
4524
+ "mode": "0000644",
4525
+ "sha256": "ab20c06268f30d0ed7198774d7435237f63440550235bdc5b926870db56886e7"
4526
+ },
4517
4527
  {
4518
4528
  "path": "modules/grading/grader-prompt.js",
4519
4529
  "mode": "0000644",
@@ -4592,7 +4602,7 @@
4592
4602
  {
4593
4603
  "path": "modules/grading/grader.js",
4594
4604
  "mode": "0000644",
4595
- "sha256": "1234bb3c9938fd4cf71c39e4660d69c56a27de667ee7ff09b0f865374b6beba4"
4605
+ "sha256": "968363ed43dfd3792462996b061e90cb7af30d9c31a6d6bd39e68ec812b47706"
4596
4606
  },
4597
4607
  {
4598
4608
  "path": "modules/grading/module.json",
@@ -4627,7 +4637,7 @@
4627
4637
  {
4628
4638
  "path": "modules/hall-ui/public/atlas.html",
4629
4639
  "mode": "0000644",
4630
- "sha256": "5be54f6e574fd171cfccad405e006873ff110206777c95bd6f482befe0e9c600"
4640
+ "sha256": "7a18c8a53bf17b4eb5fecdd108fefa518d917a297651dae32bda31ef650f0d0c"
4631
4641
  },
4632
4642
  {
4633
4643
  "path": "modules/hall-ui/public/atlas.js",
@@ -4647,7 +4657,7 @@
4647
4657
  {
4648
4658
  "path": "modules/hall-ui/public/blockers.html",
4649
4659
  "mode": "0000644",
4650
- "sha256": "efe8931f650fcb1e98194f34cf0f4cc11e570e565c51bae2223beacb4307ae94"
4660
+ "sha256": "a41140a699e8d0a12cdeb22804f21a33c96ae0467f71260eb6a06ddce26618ee"
4651
4661
  },
4652
4662
  {
4653
4663
  "path": "modules/hall-ui/public/blockers.js",
@@ -4667,7 +4677,7 @@
4667
4677
  {
4668
4678
  "path": "modules/hall-ui/public/board-room.html",
4669
4679
  "mode": "0000644",
4670
- "sha256": "362381c40f1011455cab89d473108eb3f41747fe46cde62d932744fc2d2512f0"
4680
+ "sha256": "52ac2cac716ea87e028437d132d2b088527aea365ed8093381c40e194d014d80"
4671
4681
  },
4672
4682
  {
4673
4683
  "path": "modules/hall-ui/public/board-room.js",
@@ -4707,7 +4717,7 @@
4707
4717
  {
4708
4718
  "path": "modules/hall-ui/public/collab.html",
4709
4719
  "mode": "0000644",
4710
- "sha256": "9876929d0ce989d12dadcdfa6da5cd93ca660e0b291a24a467a920632245dd65"
4720
+ "sha256": "3255ef7a523ec831ef1fded9c9ef18fcc6298dc81a5c6510233cc42a247af613"
4711
4721
  },
4712
4722
  {
4713
4723
  "path": "modules/hall-ui/public/collab.js",
@@ -4727,7 +4737,7 @@
4727
4737
  {
4728
4738
  "path": "modules/hall-ui/public/copy-desk.html",
4729
4739
  "mode": "0000644",
4730
- "sha256": "96b2dac4c916f1912bd5b5b954bbdea598581e4213cc905ea2ee4db7583d115d"
4740
+ "sha256": "16eba28547728612dcbcb9563021cf01a6ef5fe6a207fd01cf8744017fac3f67"
4731
4741
  },
4732
4742
  {
4733
4743
  "path": "modules/hall-ui/public/copy-desk.js",
@@ -4767,7 +4777,7 @@
4767
4777
  {
4768
4778
  "path": "modules/hall-ui/public/deploy.html",
4769
4779
  "mode": "0000644",
4770
- "sha256": "1dabc13d4c3dc59e10918348e0607ab7162522ba91d0269e3d4db3fbf5f0001e"
4780
+ "sha256": "939d7544560d07848172df49700bdbb6f13d9e8ccb04040cf3f85a2eafd1f9bf"
4771
4781
  },
4772
4782
  {
4773
4783
  "path": "modules/hall-ui/public/deploy.js",
@@ -4792,7 +4802,7 @@
4792
4802
  {
4793
4803
  "path": "modules/hall-ui/public/diagrams.html",
4794
4804
  "mode": "0000644",
4795
- "sha256": "8586c32beb1d116a7d37505328b077efc3499315c73b02727d28b9f82cd78eb3"
4805
+ "sha256": "85d09cb964c7938e7634e8ec15bb31229ec2ae3bfbe6c3152ded85b10e5f2122"
4796
4806
  },
4797
4807
  {
4798
4808
  "path": "modules/hall-ui/public/diagrams.states.json",
@@ -4807,7 +4817,7 @@
4807
4817
  {
4808
4818
  "path": "modules/hall-ui/public/drachmae.html",
4809
4819
  "mode": "0000644",
4810
- "sha256": "89bd28f00b4f4849b8789f8d5b4d5eb50705fddeb65f1675bb0d88fc43fd1859"
4820
+ "sha256": "357f766069e13f836e5d229451b0644579bb7d5f2db9228317a513dd46024508"
4811
4821
  },
4812
4822
  {
4813
4823
  "path": "modules/hall-ui/public/drachmae.js",
@@ -4832,7 +4842,7 @@
4832
4842
  {
4833
4843
  "path": "modules/hall-ui/public/gate.html",
4834
4844
  "mode": "0000644",
4835
- "sha256": "0b07c5a358d50b8537e303fc8fc84a2ae5100c09df7af1e15b96caa5a677aa76"
4845
+ "sha256": "b8581d242c8b228070b719020222a86c6049de4004881d059636fa27c6740213"
4836
4846
  },
4837
4847
  {
4838
4848
  "path": "modules/hall-ui/public/gate.js",
@@ -4872,7 +4882,7 @@
4872
4882
  {
4873
4883
  "path": "modules/hall-ui/public/goals.html",
4874
4884
  "mode": "0000644",
4875
- "sha256": "ecbd2c50f6dc00f9243417f27ed40603498cd7a8178e6701a1151d9188baff2c"
4885
+ "sha256": "47a148b1c67e6d81fcd032b21dbd988fffbff6602a34c92c69cfb0114411e867"
4876
4886
  },
4877
4887
  {
4878
4888
  "path": "modules/hall-ui/public/goals.js",
@@ -4892,7 +4902,7 @@
4892
4902
  {
4893
4903
  "path": "modules/hall-ui/public/government.html",
4894
4904
  "mode": "0000644",
4895
- "sha256": "83338cc027af8f146960f58c3398dd28c0218c9671aad2327eef6d81588f85b8"
4905
+ "sha256": "b275b437bbc25dec17f2ff33d3d4673dae4bc9e3bf6a08db538405267303d731"
4896
4906
  },
4897
4907
  {
4898
4908
  "path": "modules/hall-ui/public/government.js",
@@ -4932,7 +4942,7 @@
4932
4942
  {
4933
4943
  "path": "modules/hall-ui/public/idea.html",
4934
4944
  "mode": "0000644",
4935
- "sha256": "4edb9800c4b7ae528f66dfcfb89f4d8ee765b1923303d29c57984cde933986a1"
4945
+ "sha256": "495cabec6824445cb19363870f7893bc70c82e8ef6427c6a0acb10a9099cf384"
4936
4946
  },
4937
4947
  {
4938
4948
  "path": "modules/hall-ui/public/idea.js",
@@ -4952,7 +4962,7 @@
4952
4962
  {
4953
4963
  "path": "modules/hall-ui/public/ideas.html",
4954
4964
  "mode": "0000644",
4955
- "sha256": "c59e5f293b4dcabd01e2cd17c983b42184bb17468654888f4adf2243a506623b"
4965
+ "sha256": "7519ec60796cc13455a706b68a28df4906f5eb97c6c383402602d6724dc109c3"
4956
4966
  },
4957
4967
  {
4958
4968
  "path": "modules/hall-ui/public/ideas.js",
@@ -4967,7 +4977,7 @@
4967
4977
  {
4968
4978
  "path": "modules/hall-ui/public/index.html",
4969
4979
  "mode": "0000644",
4970
- "sha256": "a1cb9e9d3378c6a8c0e78add088bc8f8a705da26b83a6f6ebef8d5136f44b6c9"
4980
+ "sha256": "cb27c9d4a53bfc99e31cf235f7809330c762145228492cb21cfa1a7df6bb0b69"
4971
4981
  },
4972
4982
  {
4973
4983
  "path": "modules/hall-ui/public/index.states.json",
@@ -4987,7 +4997,7 @@
4987
4997
  {
4988
4998
  "path": "modules/hall-ui/public/modules.html",
4989
4999
  "mode": "0000644",
4990
- "sha256": "493de4531267d2b0b0ce268cc5998e33d54481442af619771f05dc27182e6f18"
5000
+ "sha256": "ad62097f5917f2b7bf5d97506f59f684525c4704b99c05dc0b34225d248270ee"
4991
5001
  },
4992
5002
  {
4993
5003
  "path": "modules/hall-ui/public/modules.js",
@@ -5022,7 +5032,7 @@
5022
5032
  {
5023
5033
  "path": "modules/hall-ui/public/people.html",
5024
5034
  "mode": "0000644",
5025
- "sha256": "8df57c42bbcf1309bce63228b63c6f2ab2f8fbf70cfd6dd9e4228b4d5b7e09b4"
5035
+ "sha256": "8e4eb3cc38902efc9df68fb59ff3d89b73c8544e64f2d1ff6de758a40ca58de1"
5026
5036
  },
5027
5037
  {
5028
5038
  "path": "modules/hall-ui/public/people.js",
@@ -5042,7 +5052,7 @@
5042
5052
  {
5043
5053
  "path": "modules/hall-ui/public/primer.html",
5044
5054
  "mode": "0000644",
5045
- "sha256": "988261501fd425e7e94cd8d236ffbab7a42d6d73f65bac6b33a6b8bf4f7fe7a1"
5055
+ "sha256": "7f4a81acd3cfb689cb928916cd22cc2f059865f0adf1c0d86b5bd24ebee6cae4"
5046
5056
  },
5047
5057
  {
5048
5058
  "path": "modules/hall-ui/public/primer.js",
@@ -5082,7 +5092,7 @@
5082
5092
  {
5083
5093
  "path": "modules/hall-ui/public/profile.html",
5084
5094
  "mode": "0000644",
5085
- "sha256": "b169bf612448988b8f114c2b1702463b49f643afe20b29cbb43a7b5bcb18b549"
5095
+ "sha256": "a8bea342986ab3fd751ce8a6c026ddbd63d3982ee1e588611e506e26d6822198"
5086
5096
  },
5087
5097
  {
5088
5098
  "path": "modules/hall-ui/public/profile.js",
@@ -5102,7 +5112,7 @@
5102
5112
  {
5103
5113
  "path": "modules/hall-ui/public/project-settings.html",
5104
5114
  "mode": "0000644",
5105
- "sha256": "d96bd79671787688cbfb58633236b6287a06356767bc53a8b9f96294e2850335"
5115
+ "sha256": "dbc1290d64354c12931779db84645637b118356df8a5173006c9fe19865e7116"
5106
5116
  },
5107
5117
  {
5108
5118
  "path": "modules/hall-ui/public/project-settings.js",
@@ -5112,7 +5122,7 @@
5112
5122
  {
5113
5123
  "path": "modules/hall-ui/public/ranks.html",
5114
5124
  "mode": "0000644",
5115
- "sha256": "07396f9135db32359405d5c290549d0d6fb3d2c3a799408c1a268afbdd72ba3c"
5125
+ "sha256": "96fc146b06eed3cf008474d4a749ce153d44e6ffdc339cbfb0f24e80cf3473ea"
5116
5126
  },
5117
5127
  {
5118
5128
  "path": "modules/hall-ui/public/ranks.js",
@@ -5142,7 +5152,7 @@
5142
5152
  {
5143
5153
  "path": "modules/hall-ui/public/roadmap.html",
5144
5154
  "mode": "0000644",
5145
- "sha256": "f4d80840fc87ca128a193d4a68bfe8c8cce1df25c5b490ee7cc5166ab1a1b381"
5155
+ "sha256": "e23079e6c99511315ff6cc5be3332177e0f9d2ce02834b71f7cb0c800ed0bd6b"
5146
5156
  },
5147
5157
  {
5148
5158
  "path": "modules/hall-ui/public/roadmap.js",
@@ -5162,7 +5172,7 @@
5162
5172
  {
5163
5173
  "path": "modules/hall-ui/public/roster.html",
5164
5174
  "mode": "0000644",
5165
- "sha256": "4edbfb63eb08a0c0e96efec59f6559b62bc4bed24eaebe3ef4169382a8e1124c"
5175
+ "sha256": "efdbdf33e10be17474c5d46e633865834b41abfbc54f02a0bca9fe54d8642024"
5166
5176
  },
5167
5177
  {
5168
5178
  "path": "modules/hall-ui/public/roster.js",
@@ -5182,7 +5192,7 @@
5182
5192
  {
5183
5193
  "path": "modules/hall-ui/public/sessions.html",
5184
5194
  "mode": "0000644",
5185
- "sha256": "3a3a17d9623e601c2c45d9c87f34ad3b29c7ba495658dda9900086ecd47a64de"
5195
+ "sha256": "2627f0cdd7c7bda698f1f4c37e5acfa0278e665dcbf1bd189d538fc111c15e2e"
5186
5196
  },
5187
5197
  {
5188
5198
  "path": "modules/hall-ui/public/sessions.js",
@@ -5222,7 +5232,7 @@
5222
5232
  {
5223
5233
  "path": "modules/hall-ui/public/settings.html",
5224
5234
  "mode": "0000644",
5225
- "sha256": "6c3e1dd29a8822091e3dee20598578712bf74d67936465fd9d3c15a5855a996e"
5235
+ "sha256": "03608a940bab5b723ee848d05c355f61d1d129efe0c7a1f68e2577d640de8b68"
5226
5236
  },
5227
5237
  {
5228
5238
  "path": "modules/hall-ui/public/settings.js",
@@ -5252,7 +5262,7 @@
5252
5262
  {
5253
5263
  "path": "modules/hall-ui/public/studio.html",
5254
5264
  "mode": "0000644",
5255
- "sha256": "ea0051dba4a0e4e2ebde1ab1dcaeaedac697d41f89df35526286beb018553025"
5265
+ "sha256": "5dcde0e7fc83c9d0f861530bbfa094977d3e10a2efd53c0d7eea7b43d8036a53"
5256
5266
  },
5257
5267
  {
5258
5268
  "path": "modules/hall-ui/public/studio.js",
@@ -5287,7 +5297,7 @@
5287
5297
  {
5288
5298
  "path": "modules/hall-ui/public/task.html",
5289
5299
  "mode": "0000644",
5290
- "sha256": "5d8a37f1d69506824339063f9f9f3b1af1f9569ca28738e638eaa98a19e86ea8"
5300
+ "sha256": "e239a66b0dacef8799eb0402a26d4938fb58c9ea019bcf5c7ede01286ae67fff"
5291
5301
  },
5292
5302
  {
5293
5303
  "path": "modules/hall-ui/public/task.js",
@@ -5312,7 +5322,7 @@
5312
5322
  {
5313
5323
  "path": "modules/hall-ui/public/watch.html",
5314
5324
  "mode": "0000644",
5315
- "sha256": "9e1dff41ebd8f0872d45057edf378e3e587ae68499973cc8bafa97bb92c4d61d"
5325
+ "sha256": "c235d89f45fb12cfbefe6cf22000de2804f3b4c9887419c981d220695985188f"
5316
5326
  },
5317
5327
  {
5318
5328
  "path": "modules/hall-ui/public/watch.js",
@@ -5332,7 +5342,7 @@
5332
5342
  {
5333
5343
  "path": "modules/hall-ui/public/work.html",
5334
5344
  "mode": "0000644",
5335
- "sha256": "f8e72cd4d322554ac6ebdf49dcb48b001e61a09bdbfb62390b409fc0c867b0dd"
5345
+ "sha256": "819ca20923783af7b7ecae16b0a44e42f460d0f7af5179f78f9ee5f41220574e"
5336
5346
  },
5337
5347
  {
5338
5348
  "path": "modules/hall-ui/public/work.js",
@@ -7872,12 +7882,12 @@
7872
7882
  {
7873
7883
  "path": "package-lock.json",
7874
7884
  "mode": "0000644",
7875
- "sha256": "c74ec04aa7a18c9c94e42afecaac34a114331a3769e1df4af00e192555155f66"
7885
+ "sha256": "90c995ff72567f0389795d8aabe1e76d05d0ac47b604081c0f03725a0a66737a"
7876
7886
  },
7877
7887
  {
7878
7888
  "path": "package.json",
7879
7889
  "mode": "0000644",
7880
- "sha256": "fc839d817a279254882dd33532bbbb2831174de15f28b3c72a3830021e8ded5f"
7890
+ "sha256": "f406c6c8801548af676175664eb13a14e0f80ee58a8106eca0ed075baab77136"
7881
7891
  },
7882
7892
  {
7883
7893
  "path": "public-docs/index.html",
@@ -8977,7 +8987,7 @@
8977
8987
  {
8978
8988
  "path": "scripts/gds/run-unit-tests.js",
8979
8989
  "mode": "0000644",
8980
- "sha256": "a40a90ba6255820130aa6a94ddc314b643177e4a153750dc6290550a75e1a4e8"
8990
+ "sha256": "d3567553fb963ad78c0ab36dd283fbf5c46e188dd7538e00fed36442f7ab2515"
8981
8991
  },
8982
8992
  {
8983
8993
  "path": "scripts/gds/runner-drift.js",
@@ -9212,7 +9222,7 @@
9212
9222
  {
9213
9223
  "path": "scripts/gds/ship-flow.js",
9214
9224
  "mode": "0000644",
9215
- "sha256": "4b8179e5c1aae3fc4845457a4089c57f6cf105c33d03d21d3ade99776371e50f"
9225
+ "sha256": "b6198e134156b755bcffa3c385c9b2ec780dcd7681791c1d3fb938217bd8102b"
9216
9226
  },
9217
9227
  {
9218
9228
  "path": "scripts/gds/ship-git.js",
@@ -9222,12 +9232,12 @@
9222
9232
  {
9223
9233
  "path": "scripts/gds/ship-grade-steps.js",
9224
9234
  "mode": "0000644",
9225
- "sha256": "158a01214499cd229a51819cd2dfcfee2eae34475f87f23795f81ec83d54f337"
9235
+ "sha256": "204834c41dd184ebc076dcd57d6a5370a910f4fc9c276bb3984b08b43f550012"
9226
9236
  },
9227
9237
  {
9228
9238
  "path": "scripts/gds/ship-grade.js",
9229
9239
  "mode": "0000644",
9230
- "sha256": "b1fb38635433b579fbb38d65e92b9db226cccb753866ab7a2a15227796be66cd"
9240
+ "sha256": "40c6a9f6aa6a75cdf8a5e41bfa8318766636cba64e47aee870c26a719676713d"
9231
9241
  },
9232
9242
  {
9233
9243
  "path": "scripts/gds/ship-honesty.js",
@@ -9812,7 +9822,7 @@
9812
9822
  {
9813
9823
  "path": "src/bongos/routes/me.js",
9814
9824
  "mode": "0000644",
9815
- "sha256": "4be2b550184af2541f20c5b1a40cce4b61beb2eb676d4de7d2c05b0d9a92dfd4"
9825
+ "sha256": "d53906b0df21f0b645bc0553d2913e8b60bec2b4cbe7bb1f9c5a71ea8de27f44"
9816
9826
  },
9817
9827
  {
9818
9828
  "path": "src/bongos/routes/modules.js",
@@ -9877,7 +9887,7 @@
9877
9887
  {
9878
9888
  "path": "src/module-api.js",
9879
9889
  "mode": "0000644",
9880
- "sha256": "e5fb0cc646c7821da2c99ceb43ee9a9214399fb81b1ee26e1c9bc84ff5bff380"
9890
+ "sha256": "6e48d3680bf84d97e45001deee8c64b2a5a31eed9ce9b68515b13d4a42086203"
9881
9891
  },
9882
9892
  {
9883
9893
  "path": "src/module-loader/catalog.js",
@@ -10782,7 +10792,7 @@
10782
10792
  {
10783
10793
  "path": "tests/core_update_banner.mjs",
10784
10794
  "mode": "0000644",
10785
- "sha256": "734be5047155f3feed777a416adb4eeadec171da9922bbde4cb1739ac7265f8c"
10795
+ "sha256": "9f2cdc1780a59602454b42f59be746fc7af246a7e3e62ade83774aebf63fe4a7"
10786
10796
  },
10787
10797
  {
10788
10798
  "path": "tests/core_upgrade_door.mjs",
@@ -11217,7 +11227,7 @@
11217
11227
  {
11218
11228
  "path": "tests/git_merge_regen.mjs",
11219
11229
  "mode": "0000644",
11220
- "sha256": "a55ae255245a53429cc7948e35ea0515bf58307f826d605d6ffd52cc60196ef8"
11230
+ "sha256": "79208b90f1b785af56ab057c858e96cea4e67ebf247858457addedce55e71b06"
11221
11231
  },
11222
11232
  {
11223
11233
  "path": "tests/github_push_ancestry.mjs",
@@ -11649,6 +11659,11 @@
11649
11659
  "mode": "0000644",
11650
11660
  "sha256": "1823c173f811d52d93b63201d0ebb0d85f2b1e42a569e6331580ef097f5c05cc"
11651
11661
  },
11662
+ {
11663
+ "path": "tests/grader_no_artifact.mjs",
11664
+ "mode": "0000644",
11665
+ "sha256": "c8450702a2d805d1cf5e826a3dedf49fff6cd01c6ca540fa9c64444fc874d5d3"
11666
+ },
11652
11667
  {
11653
11668
  "path": "tests/grader_panel.mjs",
11654
11669
  "mode": "0000644",
@@ -11657,7 +11672,7 @@
11657
11672
  {
11658
11673
  "path": "tests/grader_prompt_fencing.mjs",
11659
11674
  "mode": "0000644",
11660
- "sha256": "fa155f3c5faa3763d1a51d56b7746ad870e826e3249f5e9b08108a3cfbfcbd72"
11675
+ "sha256": "b626e614de000078eef1b305f6322d94326f032bcbeba2808baaa9dcc8ed3103"
11661
11676
  },
11662
11677
  {
11663
11678
  "path": "tests/grader_quality_window_overflow.mjs",
@@ -12479,6 +12494,11 @@
12479
12494
  "mode": "0000644",
12480
12495
  "sha256": "03b61cb8de6713b03fe17b2b3c5d70af7c511b33b17a42295f49c36e27771470"
12481
12496
  },
12497
+ {
12498
+ "path": "tests/nav_permission_atoms.mjs",
12499
+ "mode": "0000644",
12500
+ "sha256": "c965c4d56b00ec2cdf476ca045c8e28120ca16b57f26006a9017350b44014e92"
12501
+ },
12482
12502
  {
12483
12503
  "path": "tests/needs_rebase.mjs",
12484
12504
  "mode": "0000644",
@@ -12502,7 +12522,7 @@
12502
12522
  {
12503
12523
  "path": "tests/no_artifact_escalation.mjs",
12504
12524
  "mode": "0000644",
12505
- "sha256": "3d2b03a39cbefc02565a190dee0612e14576edbf32ea0fccf798d6ed28fee8f1"
12525
+ "sha256": "f1523ee48247d18c7326b9aa0b442ca2c9fab8bd41dbe9f23a4cb89e1986bee0"
12506
12526
  },
12507
12527
  {
12508
12528
  "path": "tests/oauth_secret.mjs",
@@ -13677,7 +13697,7 @@
13677
13697
  {
13678
13698
  "path": "tests/skip_is_not_pass.mjs",
13679
13699
  "mode": "0000644",
13680
- "sha256": "6258b4a3ad76a1d9139b053535c173760c5b42aa82510541501b6fef5ddd1fe1"
13700
+ "sha256": "db9e246f1ce7ef6306b938d325c450e31f2e834244f64dd2f0aaea96e760d987"
13681
13701
  },
13682
13702
  {
13683
13703
  "path": "tests/smoke_preflight.mjs",
@@ -20,6 +20,15 @@ node scripts/gds/api.js GET "/api/bongos/tasks/<id>?include=grade"
20
20
 
21
21
  Bucket by grade shape: `passed`, failed, `signals.panel_outcome='unavailable'` (outage — no quality signal existed), or no grade row at all.
22
22
 
23
+ **Then split off the no-artifact species before any leg reads the bucket** (task 1004011, ADR 0320). A grade with `signals.no_artifact_grade === true` judged the builder's **claim that nothing was needed** — the handoff notes and value summary against the task description — not a diff. There is no diff, no panel, and one generalist shot (`signals.lenses_dropped` names the four lenses that did not run). It is a real grade and a real gate, but it measures a different thing, so:
24
+
25
+ - **Do not average or count it alongside diff grades.** A 7.5 over three paragraphs of prose and a 7.5 over a 400-line diff are not the same number.
26
+ - **Leg 2 still applies, and matters more here.** A `blocker`/`major` on a no-artifact pass usually means the *evidence* was thin — queue it the same way.
27
+ - **Leg 3 does not apply** — there is no merged diff to re-read for runtime behaviour. The equivalent question, worth asking on any no-artifact pass that shipped on assertion alone, is: *could a reader today re-run or re-read what the notes claim?* If not, queue it.
28
+ - **A no-artifact FAIL is not an override candidate for Leg 1** unless it also landed. The builder's remedy is better evidence, not a permission.
29
+
30
+ Note `task_grades.grader_kind` is **not** the discriminator: the server records `'subagent'` for everything arriving through `POST /tasks/:id/grade`. `signals.no_artifact_grade` is the durable marker.
31
+
23
32
  ## Leg 1 — the override ledger
24
33
 
25
34
  For every shipped task whose grade **failed** (or is absent), the land needed an override. Cross-reference the ledger (Archon — `override_request.decide`):
@@ -0,0 +1,159 @@
1
+ # ADR 0320 — An empty diff is not an ungraded diff: grade the claim instead
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-09-20
5
+ - **Task:** 1004011 · goal 1000118 · scoped out of task 1003950 (shape 2)
6
+ - **Supersedes nothing.** Narrows [ADR 0041](0041-temporary-grader-bypass-killswitch.md)'s reach: the `--allow-empty` close is no longer one of the things `task.confirm.grade_bypass` gates.
7
+ - **Drops** task 1004010, the alternative shape (a new permission atom for the same close). Owner decision, 2026-09-20 — see §5.
8
+
9
+ ## 1. Context
10
+
11
+ `scripts/gds/ship.js --allow-empty` is how a builder closes a task that produced no
12
+ committed artifact: the premise turned out to be false, the work was a pure
13
+ verification, the change landed directly in the database or on the host.
14
+
15
+ Until now that flag did two things at once. It set `skipGrade = true` — the subagent
16
+ grader never ran — and it therefore routed the close through
17
+ `POST /tasks/:id/confirm`, whose gate is `task.confirm.grade_bypass`, one of the four
18
+ trust-boundary keys [ADR 0157](0157-archon-is-rank-and-identity-only.md) names. In
19
+ practice a Metic could not close an artifact-free task at all without asking an Archon.
20
+
21
+ Task 1003950 shipped a terminating escalation on that refusal so the builder at least
22
+ stopped looping. It deliberately left the underlying shape alone and filed two
23
+ alternatives: give the close its own lower-floored permission atom (1004010), or remove
24
+ the need for a permission by grading something real (1004011, this one).
25
+
26
+ ## 2. The two things that were wrong
27
+
28
+ **The permission was the wrong question.** `task.confirm.grade_bypass` means *ratify
29
+ this past a grade that FAILED*. That is a genuine trust-boundary act: a verdict exists
30
+ and a human is overriding it. An `--allow-empty` close is not that. No verdict exists,
31
+ because there was nothing for the grader to read. Charging the same key for "it was
32
+ judged and rejected" and "there was nothing to judge" conflates a override with an
33
+ absence, and the cost of the conflation was that the cheapest, least scrutinised ship
34
+ in the system needed the most powerful key to perform.
35
+
36
+ **Nothing was being checked.** This is the more serious half. On a no-artifact ship the
37
+ grader was skipped *entirely*, so the assertions in the handoff notes — "the premise was
38
+ already fixed", "this was a pure ops verification", "the row was updated directly" —
39
+ went into the ledger unexamined. The ledger is the complete record of what happened to
40
+ the project (CLAUDE.md §8), and on exactly the ships where the record is the *only*
41
+ evidence, nothing read it. A permission gate is not a substitute for scrutiny: an Archon
42
+ clicking confirm is not the same as someone checking whether the claim is true.
43
+
44
+ ## 3. Decision
45
+
46
+ **On an `--allow-empty` ship, grade the NOTES (and the value summary) against the task
47
+ description, instead of skipping the grade.** The grader's question becomes: *is this
48
+ task genuinely artifact-free, and does the evidence given support that?* A pass is a
49
+ real passing grade that confirms through the ordinary rank-open path and needs no bypass
50
+ permission. A fail is a real fail, and the remedy is better evidence, not a key.
51
+
52
+ Four sub-decisions carry most of the weight:
53
+
54
+ **D1 — The rubric axes are re-asked, not replaced.** The gate downstream is
55
+ `functional_fidelity >= THRESHOLD AND code_quality >= THRESHOLD AND confidence >= 0.4`,
56
+ and `/grade-audit`, the aggregates and the cost model all read those columns. Inventing
57
+ a third pair of axis names would have meant teaching every one of them a synonym. So the
58
+ axes keep their names and the prompt re-asks them for this species:
59
+ `functional_fidelity` → *is this genuinely artifact-free?*; `code_quality` → *is the
60
+ evidence specific and checkable, or bare assertion?*. The gate arithmetic is untouched.
61
+
62
+ **D2 — Two generalist shots, not the four-lens panel.** The panel is Hacker / Quality /
63
+ Efficiency / (Reader) — lenses over code. Over three paragraphs of prose they are four
64
+ readings of the same short text at four times the cost, so the lenses go, recorded in
65
+ `signals.lenses_dropped` rather than left to be inferred from their absence (the
66
+ trivial-diff precedent, #513: lighter, never silent).
67
+
68
+ The panel's unanimous gate, however, was also the cross-check that makes injection
69
+ hard — an attacker must fool *every* gating worker. This decision's first implementation
70
+ kept a single shot and lost that property; the grader failed the ship on it, correctly
71
+ (see D4). So the species runs **two** independent readings of the same prompt, collapsed
72
+ by **unanimity, not median**: the worst score on each axis, and a pass only if every shot
73
+ passed. Under a median the collapse would be actively harmful — the median of two is
74
+ their mean, so a fooled 10 averages with a suspicious 3 into a passing 6.5 and the second
75
+ reading launders the first. A split verdict is recorded as `signals.shot_dissent`, since
76
+ two readings of the same fenced text disagreeing is itself worth a human's eye.
77
+
78
+ The collapse covers **all three gate axes, `confidence` included** — a point the second
79
+ round of grading caught, because the first fix collapsed only `functional_fidelity` and
80
+ `code_quality`. Confidence is easy to miss: it is the one gate axis that lives in
81
+ `signals` rather than `rubric_scores`. Leaving it at the median would have reintroduced
82
+ the same laundering on the axis where it matters most, since the server's
83
+ `validateAndScore` derives `lowConfidence` purely from the submitted value and never sees
84
+ the client's `unanimous` boolean — a shot honestly reporting 0.2 ("I cannot judge this
85
+ claim", the value that exists to fall through to a human) would average with a confident
86
+ 0.9 and clear the 0.4 gate at 0.55.
87
+
88
+ **D4 — Every builder-controlled field is scrubbed and fenced (SR-15 / #995).** The panel
89
+ workers have wrapped the diff, title, description and value summary in
90
+ `grader-workers/fence.js` since #995, because a builder can embed steering text in their
91
+ own artifact. This species carries the same inputs and is the worse case on both sides of
92
+ the ledger: the notes are not context around an artifact the model can independently
93
+ check, they *are* the evidence; and a successful injection does not merely flip one of
94
+ four workers, it closes a task past the scrutiny this ADR introduced to replace the
95
+ Archon-only gate. So fencing here is not defence in depth, it is the boundary. The
96
+ no-follow rule is also restated *after* the artifact, because the notes may run to 24,000
97
+ characters and a rule stated once at the top is a long way behind by the end of an
98
+ adversarial payload.
99
+
100
+ **D3 — The species marker lives in `signals`, not in `grader_kind`.** The server's
101
+ `validateAndScore` hardcodes `task_grades.grader_kind` to `'subagent'` for everything
102
+ arriving through `POST /tasks/:id/grade`, so the column cannot carry the distinction
103
+ without teaching every consumer of that enum a new member. `signals.no_artifact_grade`
104
+ is submitted verbatim and stored, so it is the durable discriminator.
105
+ `signals.graded_subject = 'notes'` says what was read.
106
+
107
+ ## 4. Consequences
108
+
109
+ - A Metic can now close a genuinely artifact-free task on the strength of a graded
110
+ claim. `task.confirm.grade_bypass` keeps exactly the meaning ADR 0041 gave it and
111
+ loses a use it never should have had.
112
+ - **A second grade species exists in `task_grades`.** Every consumer that averages,
113
+ counts or spot-checks grades must split on `signals.no_artifact_grade` first: a score
114
+ over prose and a score over a 400-line diff are not the same measurement.
115
+ `/grade-audit` is updated with that rule in this change.
116
+ - **No-artifact closes get harder, not easier, for the dishonest.** The permission wall
117
+ was indiscriminate — it stopped the honest Metic and waved through any Archon. The
118
+ grade is discriminating: it reads the claim. "Confirmed working" with nothing a reader
119
+ could re-run now fails an axis that previously did not exist.
120
+ - **The diff-hash reuse key is deliberately not set** for this species. Hashing the empty
121
+ diff would let the *next* empty-diff ship of the same task reuse this grade — a
122
+ different claim, different notes, silently inheriting a pass it never earned.
123
+ - **Below the protected-path floor, nothing changes.** The server's Guard 1b (task
124
+ 1002646) fails a passing grade closed when a below-floor builder submits no
125
+ `committed_files`, and a no-artifact grade submits none by definition. That guard is
126
+ correct and untouched: for a sub-floor builder the permission-path check is genuinely
127
+ unprovable. This decision moves the Metic-and-above case, which is the case that was
128
+ filed.
129
+ - `--skip-grade` is unchanged and still reaches the Archon gate. The escalation split
130
+ task 1003950 added still decides which refusal prints there.
131
+
132
+ ## 5. Alternatives considered
133
+
134
+ **Task 1004010 — a new permission atom for the no-artifact close.** The sibling shape,
135
+ and the one this drops. It would have added a lower-floored relative of a trust-boundary
136
+ key, plus a governance migration and a `system: true` decision of its own. Rejected on
137
+ two grounds: it answers "who may skip the check" when the better question is "why is
138
+ there no check", and it permanently widens the permission surface — the same class of
139
+ change the owner declined three days earlier for `version.create` (task 1003853,
140
+ [ADR 0250](0250-strict-versioning-the-version-boundary-is-the-scope-gate.md) §6a).
141
+ Solving the problem without a new atom is the consistent call. The row is closed, with
142
+ its problem statement kept should this fail to land.
143
+
144
+ **Keep skipping the grade, lower the floor on the existing key.** Cheapest, and wrong
145
+ for the same reason as 1004010: it treats the gate as the point. Nothing would read the
146
+ notes.
147
+
148
+ **Grade the notes with the full panel.** Rejected under D2 — four code lenses over prose
149
+ is cost without signal. Note what the rejection had to preserve separately: the panel's
150
+ value here was never its lenses, it was the unanimity of its gate, and D2 keeps that with
151
+ two shots rather than four lenses.
152
+
153
+ **A single generalist shot.** This decision's first implementation, and wrong for a
154
+ reason that only became visible once the prompt was written: it leaves one reading
155
+ between a crafted set of handoff notes and a closed task. Corrected before landing.
156
+
157
+ **A new pair of rubric axes for prose.** Rejected under D1 — honest about the
158
+ measurement, but it moves the gate arithmetic and every consumer of it, for a naming
159
+ gain.