@bongos/core 1.19.257 → 1.19.259
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 +81 -26
- package/docs/adr/0022-secrets-policy.md +16 -12
- package/docs/architecture.md +7 -1
- package/docs/file-map.md +1 -0
- package/docs/handoff-template.md +1 -1
- package/docs/recipes/README.md +1 -1
- package/docs/recipes/redteam-patrol.md +48 -0
- package/migrations/core_222_idea_inbox_suggested_goal.sql +57 -0
- package/modules/ideas/migrations/ideas_003_lineage_origin_route.sql +62 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/control-manifest.js +123 -0
- package/scripts/gds/fitness-ratchets.js +328 -0
- package/scripts/gds/fitness.js +4 -4
- package/scripts/gds/gen-session-index.js +8 -1
- package/scripts/gds/redteam-patrol.js +308 -0
- package/src/bongos/logger.js +118 -0
- package/src/bongos/middleware/audit.js +4 -3
- package/src/bongos/middleware/error-envelope.js +5 -4
- package/src/bongos/module-scope-map.js +1 -0
- package/src/bongos/serve-internal.js +2 -1
- package/src/module-api.js +5 -1
- package/src/platform-server.js +9 -2
- package/tests/auth_resolve_failure.mjs +1 -1
- package/tests/claude_materialize.mjs +28 -11
- package/tests/control_manifest.mjs +60 -0
- package/tests/fitness_ratchets.mjs +91 -0
- package/tests/logger.mjs +89 -0
- package/tests/publish_reconciler.mjs +142 -0
- package/tests/redteam_patrol.mjs +67 -0
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.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.259",
|
|
6
|
+
"core_contract": "1.19.259",
|
|
7
|
+
"source_commit": "c8780bb9be3f75bfac1c6c697c5d8e1d081d8dae",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-19T18:22:02.664Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 317,
|
|
13
13
|
"agent_docs_stubbed": 22,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1360,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1699,
|
|
20
|
+
"tree_sha256": "3cbb76304d7e5e19aa97c2b90a211e4b35bf3e08d882a9684184df0720855449",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -527,7 +527,7 @@
|
|
|
527
527
|
{
|
|
528
528
|
"path": "docs/adr/0022-secrets-policy.md",
|
|
529
529
|
"mode": "0000644",
|
|
530
|
-
"sha256": "
|
|
530
|
+
"sha256": "8ea4766c05c27517d19a9ef7343e4083e71604b22b88ed058071dc82399529bb"
|
|
531
531
|
},
|
|
532
532
|
{
|
|
533
533
|
"path": "docs/adr/0023-kind-multipliers-and-idea-bonus.md",
|
|
@@ -1402,7 +1402,7 @@
|
|
|
1402
1402
|
{
|
|
1403
1403
|
"path": "docs/architecture.md",
|
|
1404
1404
|
"mode": "0000644",
|
|
1405
|
-
"sha256": "
|
|
1405
|
+
"sha256": "193c04262908677d4cdee4c9ba20031ed19220c3886cce8f25f54ea3e615079f"
|
|
1406
1406
|
},
|
|
1407
1407
|
{
|
|
1408
1408
|
"path": "docs/branding-contract.md",
|
|
@@ -1532,12 +1532,12 @@
|
|
|
1532
1532
|
{
|
|
1533
1533
|
"path": "docs/file-map.md",
|
|
1534
1534
|
"mode": "0000644",
|
|
1535
|
-
"sha256": "
|
|
1535
|
+
"sha256": "9762b7f69397c28e103cdb39a9987483e23bd800a827f0d83983b62ef962616b"
|
|
1536
1536
|
},
|
|
1537
1537
|
{
|
|
1538
1538
|
"path": "docs/handoff-template.md",
|
|
1539
1539
|
"mode": "0000644",
|
|
1540
|
-
"sha256": "
|
|
1540
|
+
"sha256": "a60d85b8523b5944d4db8105b60166395ab9c1f931fb92f0f95a825b657fe277"
|
|
1541
1541
|
},
|
|
1542
1542
|
{
|
|
1543
1543
|
"path": "docs/modules-contract.md",
|
|
@@ -1617,7 +1617,7 @@
|
|
|
1617
1617
|
{
|
|
1618
1618
|
"path": "docs/recipes/README.md",
|
|
1619
1619
|
"mode": "0000644",
|
|
1620
|
-
"sha256": "
|
|
1620
|
+
"sha256": "bf3caea65a8b8a117d40544fdf352c235bb120a69444645d62b91f999a9b7731"
|
|
1621
1621
|
},
|
|
1622
1622
|
{
|
|
1623
1623
|
"path": "docs/recipes/audit-replay.md",
|
|
@@ -1729,6 +1729,11 @@
|
|
|
1729
1729
|
"mode": "0000644",
|
|
1730
1730
|
"sha256": "5bfca9628859f1cdd79d741bdd50f3fe415430ee3380a2ac7f46b97ebe082d0e"
|
|
1731
1731
|
},
|
|
1732
|
+
{
|
|
1733
|
+
"path": "docs/recipes/redteam-patrol.md",
|
|
1734
|
+
"mode": "0000644",
|
|
1735
|
+
"sha256": "3dbdc33eb1aa68da5e6569e836845f09fd14953d94794e005af67ce517fb6dad"
|
|
1736
|
+
},
|
|
1732
1737
|
{
|
|
1733
1738
|
"path": "docs/recipes/search-index-ingestion.md",
|
|
1734
1739
|
"mode": "0000644",
|
|
@@ -2409,6 +2414,11 @@
|
|
|
2409
2414
|
"mode": "0000644",
|
|
2410
2415
|
"sha256": "51d7fc76fdc59a5ab145839aa4943fe7753324022f82e4b4a76c2fe3cab9b98d"
|
|
2411
2416
|
},
|
|
2417
|
+
{
|
|
2418
|
+
"path": "migrations/core_222_idea_inbox_suggested_goal.sql",
|
|
2419
|
+
"mode": "0000644",
|
|
2420
|
+
"sha256": "9939ee2c641caa8ae4f5055c60e3208a6ed4e379b1bfd1aaa67247a8ed4a4fd8"
|
|
2421
|
+
},
|
|
2412
2422
|
{
|
|
2413
2423
|
"path": "modules/autonomy/CLAUDE.md",
|
|
2414
2424
|
"mode": "0000644",
|
|
@@ -3669,6 +3679,11 @@
|
|
|
3669
3679
|
"mode": "0000644",
|
|
3670
3680
|
"sha256": "3c30ba66b8426d6f304c8135764108f25c4c9aeb8a571347dd7c22ff7a68fad2"
|
|
3671
3681
|
},
|
|
3682
|
+
{
|
|
3683
|
+
"path": "modules/ideas/migrations/ideas_003_lineage_origin_route.sql",
|
|
3684
|
+
"mode": "0000644",
|
|
3685
|
+
"sha256": "8edeeb0bbf5bac57111008357fc287f8dc14e6907d7bc218264c40633778b9c3"
|
|
3686
|
+
},
|
|
3672
3687
|
{
|
|
3673
3688
|
"path": "modules/ideas/module.json",
|
|
3674
3689
|
"mode": "0000644",
|
|
@@ -4442,12 +4457,12 @@
|
|
|
4442
4457
|
{
|
|
4443
4458
|
"path": "package-lock.json",
|
|
4444
4459
|
"mode": "0000644",
|
|
4445
|
-
"sha256": "
|
|
4460
|
+
"sha256": "df6bf392719f8ba6a0aa64db49a0c29fc65dbc623f6efe0cf0b33e984469803b"
|
|
4446
4461
|
},
|
|
4447
4462
|
{
|
|
4448
4463
|
"path": "package.json",
|
|
4449
4464
|
"mode": "0000644",
|
|
4450
|
-
"sha256": "
|
|
4465
|
+
"sha256": "8afa3a02911351bbae1709a66e204a73ff07c65132c50fad0536246708143aac"
|
|
4451
4466
|
},
|
|
4452
4467
|
{
|
|
4453
4468
|
"path": "public-docs/index.html",
|
|
@@ -4969,6 +4984,11 @@
|
|
|
4969
4984
|
"mode": "0000644",
|
|
4970
4985
|
"sha256": "8ca6ee391837d7e1a45e69fc62c4a051f5e3d6060db507cdcbc7a343e2b03bd3"
|
|
4971
4986
|
},
|
|
4987
|
+
{
|
|
4988
|
+
"path": "scripts/gds/control-manifest.js",
|
|
4989
|
+
"mode": "0000644",
|
|
4990
|
+
"sha256": "0d5b0c5e4bc15ff914d34849607ad2f01d1843d4dafeafdaf4191c2f365300bb"
|
|
4991
|
+
},
|
|
4972
4992
|
{
|
|
4973
4993
|
"path": "scripts/gds/copy-inventory.js",
|
|
4974
4994
|
"mode": "0000644",
|
|
@@ -5079,10 +5099,15 @@
|
|
|
5079
5099
|
"mode": "0000644",
|
|
5080
5100
|
"sha256": "7a7721155c8c7cb169a48e6f279e5d7c0ba0dc4462678a4a2ec41a2686501962"
|
|
5081
5101
|
},
|
|
5102
|
+
{
|
|
5103
|
+
"path": "scripts/gds/fitness-ratchets.js",
|
|
5104
|
+
"mode": "0000644",
|
|
5105
|
+
"sha256": "a27a3873f516abdc52f7f482603779010bbc1af4d6e73c0b86dd34292017bc9a"
|
|
5106
|
+
},
|
|
5082
5107
|
{
|
|
5083
5108
|
"path": "scripts/gds/fitness.js",
|
|
5084
5109
|
"mode": "0000644",
|
|
5085
|
-
"sha256": "
|
|
5110
|
+
"sha256": "81b35af96345cfdca3f30a9d4f333715c4dd431657a9aa73b5794c02ef75686f"
|
|
5086
5111
|
},
|
|
5087
5112
|
{
|
|
5088
5113
|
"path": "scripts/gds/gate-review.js",
|
|
@@ -5152,7 +5177,7 @@
|
|
|
5152
5177
|
{
|
|
5153
5178
|
"path": "scripts/gds/gen-session-index.js",
|
|
5154
5179
|
"mode": "0000644",
|
|
5155
|
-
"sha256": "
|
|
5180
|
+
"sha256": "9b936143ae25442fefb52b98949bc33d245d4b3894d778c51926e9da75c92357"
|
|
5156
5181
|
},
|
|
5157
5182
|
{
|
|
5158
5183
|
"path": "scripts/gds/git-merge-regen.js",
|
|
@@ -5409,6 +5434,11 @@
|
|
|
5409
5434
|
"mode": "0000644",
|
|
5410
5435
|
"sha256": "564996b820fa09ccb95bcef2e5a1b57f22e5b16c4e54b67dfe1a2cd37ff716a4"
|
|
5411
5436
|
},
|
|
5437
|
+
{
|
|
5438
|
+
"path": "scripts/gds/redteam-patrol.js",
|
|
5439
|
+
"mode": "0000644",
|
|
5440
|
+
"sha256": "4e4ce11a67de653550851d9e0b9931253c8b100dd4285f2a39c74ba2f932b23c"
|
|
5441
|
+
},
|
|
5412
5442
|
{
|
|
5413
5443
|
"path": "scripts/gds/regen-instance-docs.js",
|
|
5414
5444
|
"mode": "0000644",
|
|
@@ -5879,6 +5909,11 @@
|
|
|
5879
5909
|
"mode": "0000644",
|
|
5880
5910
|
"sha256": "a932e617ee66dabc49b4087baf6606eeb2074f70ebb3efa0723b1d9c92add290"
|
|
5881
5911
|
},
|
|
5912
|
+
{
|
|
5913
|
+
"path": "src/bongos/logger.js",
|
|
5914
|
+
"mode": "0000644",
|
|
5915
|
+
"sha256": "08a48a47445606c22c1fb5f1e709de5106693eb8b774466186fb5e30352841e8"
|
|
5916
|
+
},
|
|
5882
5917
|
{
|
|
5883
5918
|
"path": "src/bongos/metrics.js",
|
|
5884
5919
|
"mode": "0000644",
|
|
@@ -5887,12 +5922,12 @@
|
|
|
5887
5922
|
{
|
|
5888
5923
|
"path": "src/bongos/middleware/audit.js",
|
|
5889
5924
|
"mode": "0000644",
|
|
5890
|
-
"sha256": "
|
|
5925
|
+
"sha256": "ad2d224b01bba5ce747f8e3ab8704cbbbd67b1bfb6f4d1237bc910e91f7e4287"
|
|
5891
5926
|
},
|
|
5892
5927
|
{
|
|
5893
5928
|
"path": "src/bongos/middleware/error-envelope.js",
|
|
5894
5929
|
"mode": "0000644",
|
|
5895
|
-
"sha256": "
|
|
5930
|
+
"sha256": "920897ba69d929ab5b77bac1605c67d78805ebbbf962d59fec5bdc8b293bd67a"
|
|
5896
5931
|
},
|
|
5897
5932
|
{
|
|
5898
5933
|
"path": "src/bongos/middleware/rate-limit.js",
|
|
@@ -5902,7 +5937,7 @@
|
|
|
5902
5937
|
{
|
|
5903
5938
|
"path": "src/bongos/module-scope-map.js",
|
|
5904
5939
|
"mode": "0000644",
|
|
5905
|
-
"sha256": "
|
|
5940
|
+
"sha256": "c3b5499005ae5150d1e3288437dbfd422e28068a28e3c5783a8c4b3fa2edd09c"
|
|
5906
5941
|
},
|
|
5907
5942
|
{
|
|
5908
5943
|
"path": "src/bongos/module-submissions.js",
|
|
@@ -6037,7 +6072,7 @@
|
|
|
6037
6072
|
{
|
|
6038
6073
|
"path": "src/bongos/serve-internal.js",
|
|
6039
6074
|
"mode": "0000644",
|
|
6040
|
-
"sha256": "
|
|
6075
|
+
"sha256": "2ce782b00c80482ef9b9d3e4a54a634e73c6d956e13e32cc7e3d2ff63e8282cd"
|
|
6041
6076
|
},
|
|
6042
6077
|
{
|
|
6043
6078
|
"path": "src/bongos/stealth-gate.js",
|
|
@@ -6072,7 +6107,7 @@
|
|
|
6072
6107
|
{
|
|
6073
6108
|
"path": "src/module-api.js",
|
|
6074
6109
|
"mode": "0000644",
|
|
6075
|
-
"sha256": "
|
|
6110
|
+
"sha256": "c00527049537e4f63e7c3d70446ebb20ba7e760fa77bb200aa26f3e2de6b22f2"
|
|
6076
6111
|
},
|
|
6077
6112
|
{
|
|
6078
6113
|
"path": "src/module-loader/catalog.js",
|
|
@@ -6112,7 +6147,7 @@
|
|
|
6112
6147
|
{
|
|
6113
6148
|
"path": "src/platform-server.js",
|
|
6114
6149
|
"mode": "0000644",
|
|
6115
|
-
"sha256": "
|
|
6150
|
+
"sha256": "704f68cdafb697138b9e012defedeb827dee3ff97191c78bf0e86be0ae5d61cf"
|
|
6116
6151
|
},
|
|
6117
6152
|
{
|
|
6118
6153
|
"path": "src/ui/adapters/claude-design/index.js",
|
|
@@ -6282,7 +6317,7 @@
|
|
|
6282
6317
|
{
|
|
6283
6318
|
"path": "tests/auth_resolve_failure.mjs",
|
|
6284
6319
|
"mode": "0000644",
|
|
6285
|
-
"sha256": "
|
|
6320
|
+
"sha256": "d14529c53ddf42f69c40fd49dc6eb230df4a519e9bc2bfdfab04df277e3dbb9c"
|
|
6286
6321
|
},
|
|
6287
6322
|
{
|
|
6288
6323
|
"path": "tests/auth_session_ttl.mjs",
|
|
@@ -6537,7 +6572,7 @@
|
|
|
6537
6572
|
{
|
|
6538
6573
|
"path": "tests/claude_materialize.mjs",
|
|
6539
6574
|
"mode": "0000644",
|
|
6540
|
-
"sha256": "
|
|
6575
|
+
"sha256": "ad3daf4c6cc3a0f56d8d205077c835397b1d112a0219dabb05a7e8b3a8da9492"
|
|
6541
6576
|
},
|
|
6542
6577
|
{
|
|
6543
6578
|
"path": "tests/clawback_confirmed_backlog.mjs",
|
|
@@ -6604,6 +6639,11 @@
|
|
|
6604
6639
|
"mode": "0000644",
|
|
6605
6640
|
"sha256": "55bd70efd8067e39d6220d14f78c743ce80d8a8ff37988acf00136b5108dc004"
|
|
6606
6641
|
},
|
|
6642
|
+
{
|
|
6643
|
+
"path": "tests/control_manifest.mjs",
|
|
6644
|
+
"mode": "0000644",
|
|
6645
|
+
"sha256": "2465159282594723a49d03ed2ca9dbb10e95ddb7af96d145c45f7d7c2a8b8cee"
|
|
6646
|
+
},
|
|
6607
6647
|
{
|
|
6608
6648
|
"path": "tests/copy_desk_flags_db.mjs",
|
|
6609
6649
|
"mode": "0000644",
|
|
@@ -6889,6 +6929,11 @@
|
|
|
6889
6929
|
"mode": "0000644",
|
|
6890
6930
|
"sha256": "ebb93b7bdd90c0775f71eb949a6e47022570bdb35c901bd4522413fefa750e14"
|
|
6891
6931
|
},
|
|
6932
|
+
{
|
|
6933
|
+
"path": "tests/fitness_ratchets.mjs",
|
|
6934
|
+
"mode": "0000644",
|
|
6935
|
+
"sha256": "781bdee0778645704b5179bf99507e839743158714f799e45d6cc64f8fc30477"
|
|
6936
|
+
},
|
|
6892
6937
|
{
|
|
6893
6938
|
"path": "tests/fitness_two_root.mjs",
|
|
6894
6939
|
"mode": "0000644",
|
|
@@ -7474,6 +7519,11 @@
|
|
|
7474
7519
|
"mode": "0000644",
|
|
7475
7520
|
"sha256": "a01036699653e810c8eb2e4f8bdabe081095e5634ef6ea4f1e4f85b2b5f56523"
|
|
7476
7521
|
},
|
|
7522
|
+
{
|
|
7523
|
+
"path": "tests/logger.mjs",
|
|
7524
|
+
"mode": "0000644",
|
|
7525
|
+
"sha256": "88508517d49ad11a01d2dbc97767c4baa6789753ea42afe76699bc2bab5017d4"
|
|
7526
|
+
},
|
|
7477
7527
|
{
|
|
7478
7528
|
"path": "tests/main_audit.mjs",
|
|
7479
7529
|
"mode": "0000644",
|
|
@@ -7877,7 +7927,7 @@
|
|
|
7877
7927
|
{
|
|
7878
7928
|
"path": "tests/publish_reconciler.mjs",
|
|
7879
7929
|
"mode": "0000644",
|
|
7880
|
-
"sha256": "
|
|
7930
|
+
"sha256": "c61741aebfad2e85e55f0e734b3195d9474f8dd0c7812c3ee1434b05d088c1de"
|
|
7881
7931
|
},
|
|
7882
7932
|
{
|
|
7883
7933
|
"path": "tests/rank_gate.mjs",
|
|
@@ -7914,6 +7964,11 @@
|
|
|
7914
7964
|
"mode": "0000644",
|
|
7915
7965
|
"sha256": "6d82e99c69d23a4dd7a844ffdd7f239ea70c94d9c509e2fc8e1a672cd9f05a28"
|
|
7916
7966
|
},
|
|
7967
|
+
{
|
|
7968
|
+
"path": "tests/redteam_patrol.mjs",
|
|
7969
|
+
"mode": "0000644",
|
|
7970
|
+
"sha256": "bf32ae5c734fc95873433b7c4e251a6b166c167ccc91c4684d061b97681c3357"
|
|
7971
|
+
},
|
|
7917
7972
|
{
|
|
7918
7973
|
"path": "tests/regrade_eligibility.mjs",
|
|
7919
7974
|
"mode": "0000644",
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
# ADR 0022 — Secrets policy
|
|
2
2
|
|
|
3
3
|
**Date:** 2026-05-28
|
|
4
|
-
**Context:** Task [#279](https://example.com/builders#/task/279) (V3.R60), GDS-V3 criterion C8.
|
|
4
|
+
**Context:** Task [#279](https://example.com/builders#/task/279) (V3.R60), GDS-V3 criterion C8. Originally built on a pre-commit hook + CI scan (task [#257](https://example.com/builders#/task/257), V3.R36); those surfaces were lost in the core extraction and rebuilt as the prevent/gate/patrol layers under goal 1000076 (task 1003131). Pairs with [ADR 0020](<redacted>.md) (security model — public stub) and [ADR 0016](<redacted>.md) (trust boundary).
|
|
5
|
+
**Enforcement rebuilt:** 2026-08-19 (task 1003131, goal 1000076) — see the Problem section's box.
|
|
5
6
|
**Status:** Accepted.
|
|
6
7
|
|
|
7
8
|
## Problem
|
|
8
9
|
|
|
9
10
|
A secret committed to a public repo is a credential someone else can use within minutes — even after a force-push to remove it, the value survives in forks, GitHub's commit cache, and any clone made between the commit and the removal. The right model is **defense in depth**: each layer assumes the next one will fail.
|
|
10
11
|
|
|
11
|
-
We
|
|
12
|
+
We have defense in depth (rebuilt under goal 1000076 — see the box below):
|
|
12
13
|
|
|
13
|
-
-
|
|
14
|
-
- `.
|
|
15
|
-
- `.
|
|
14
|
+
- **Prevent (agent-side):** `.claude/hooks/secret-gate.js`, a PreToolUse hook, blocks a secret-shaped Write/Edit/Bash payload before it reaches the tree; `.claude/settings.json` denies reading the env/key/session lanes.
|
|
15
|
+
- **Gate (CI):** `.gitleaks.toml` drives a gitleaks scan of the working tree in the required `unit` workflow on every PR.
|
|
16
|
+
- **Patrol (weekly):** `.claude/scheduled-tasks/redteam-weekly` runs a full-git-**history** gitleaks scan and files any hit as a security report.
|
|
17
|
+
- `.gitignore` lists `.env.local` and the key/PEM shapes.
|
|
16
18
|
- Live credentials resolve from `/etc/example/` on the droplet or `~/.config/otb/env` on builder laptops — neither path is tracked.
|
|
17
19
|
|
|
20
|
+
> **Why this list is now trustworthy — the assurance-of-assurance.** The controls above are not just described here; each has a row in `scripts/gds/control-manifest.js`, a fitness check that reds the merge gate if any control file is deleted or comes unwired (task 1003131). This ADR **used to** name a `.husky/pre-commit` hook, a `.github/workflows/secrets-scan.yml`, and a `docs/security-baseline.md` — **none of which existed in this repo**; they were lost in the core extraction and nothing noticed for releases (the red-team baseline audit's headline finding, [`docs/audits/ai-dev-redteam-baseline.md`](../audits/ai-dev-redteam-baseline.md) §0). A doc describing a control cannot be the assurance; the manifest is.
|
|
21
|
+
|
|
18
22
|
What's missing — and what this ADR adds — is a written **policy** that defines:
|
|
19
23
|
|
|
20
24
|
1. What counts as a secret (so the scan can be tuned).
|
|
@@ -26,7 +30,7 @@ Without this document, every new builder reinvents the answers. Some answers wil
|
|
|
26
30
|
|
|
27
31
|
## Decision
|
|
28
32
|
|
|
29
|
-
This ADR is **the policy**. The
|
|
33
|
+
This ADR is **the policy**. The prevent hook + the CI gitleaks gate + the weekly patrol are the **enforcement** (goal 1000076). `scripts/gds/control-manifest.js` — a fitness check in the `unit` gate — is the **assertion that they still exist and stay wired**. Each layer is independently maintained but consistent with this document; a change that removes an enforcement surface must update the manifest in the same commit, or CI goes red.
|
|
30
34
|
|
|
31
35
|
## What counts as a secret
|
|
32
36
|
|
|
@@ -86,11 +90,11 @@ GDS session tokens rotate automatically — they're 30-day-TTL, refresh-on-use,
|
|
|
86
90
|
|
|
87
91
|
## What to do when the scan finds a hit
|
|
88
92
|
|
|
89
|
-
If `.
|
|
93
|
+
If `.claude/hooks/secret-gate.js` blocks a write, OR the gitleaks step in the `unit` workflow fails on a PR, OR the weekly `redteam-weekly` patrol files a history-secrets report, OR `scripts/gds/control-manifest.js` flags a missing control:
|
|
90
94
|
|
|
91
95
|
1. **Stop**. Do not push, do not merge, do not delete the offending file from the working tree (yet).
|
|
92
96
|
2. **Identify the credential** — what service, what scope, was it ever active in production.
|
|
93
|
-
3. **Rotate the credential first** (steps 1-4 above). Treat the leaked value as compromised even if the scan was a
|
|
97
|
+
3. **Rotate the credential first** (steps 1-4 above). Treat the leaked value as compromised even if the scan was a prevent-hook catch — the same value may have been pasted into a chat or a sibling file.
|
|
94
98
|
4. **Then** rewrite the offending file (remove the credential) and commit. If the credential was already in pushed history, run `git filter-repo --replace-text <pattern>` to scrub it from every commit. This rewrites SHAs; force-push is required; CI scan re-validates afterward.
|
|
95
99
|
5. **Document** — add an entry to [`docs/recipes/ops-gotchas.md`](../recipes/ops-gotchas.md) with the date, what happened, and what changed in the response so the next time it goes faster.
|
|
96
100
|
6. **Forks + clones** — the rewrite doesn't reach existing clones. Anyone with an outdated clone gets a `git fetch` warning about non-fast-forward; they re-clone. Forks that mirror via GitHub's mirror feature need a manual `git push --force` from the upstream-aware operator.
|
|
@@ -109,16 +113,16 @@ The enforcement above keeps secrets out of the **repo**. A second egress exists:
|
|
|
109
113
|
|
|
110
114
|
This scrubber is **transcript-grade** and **recall-first** (task 1003, which also completed the open token-redaction of task 723): a missed secret is a credential compromise, while over-redacting a non-secret in a BFG digest is merely cosmetic, so when in doubt it redacts. Five layers: (1) literal dynamic values — this run's GDS session token + every secret-shaped **env value** (`collectEnvSecrets()`, e.g. the `MAC_*`/`APPLE_*` signing creds, a baked GDS/DO token); (2) multi-line PEM private-key blocks; (3) the in-scope known shapes from this ADR (provider key prefixes, Stripe `sk_`/`rk_`/`whsec_`, our `gds_`/`pms_` tokens, `Authorization`/`Bearer` headers, JWTs, credentialed DSNs, Apple app-specific passwords); (4) recognised-key `key=value` / JSON-field assignments; (5) a **high-entropy catch-all** (`looksHighEntropySecret()`) over base64url/hex runs ≥20 chars — the net for an *unknown* secret shape. The accepted cost of layer 5 is that high-entropy non-secrets (git SHAs, UUIDs, a 40-hex value shape-identical to a GitHub OAuth client secret) are redacted too; the structured BFG metrics that matter (token/turn counts, tool names, error flags) are separate fields and untouched. The planted-secret corpus in `tests/scrubber_corpus.mjs` is the regression gate — every planted secret must be fully redacted, every benign line must survive — and **gates the full-transcript capture task**: capture must not ship until this passes.
|
|
111
115
|
|
|
112
|
-
This scrubber is now a load-bearing enforcement surface alongside the
|
|
116
|
+
This scrubber is now a load-bearing enforcement surface alongside the prevent hook + CI gitleaks gate; a change to the in-scope secret shapes above should update it (and its corpus) too, or the policy and the enforcement will drift.
|
|
113
117
|
|
|
114
118
|
## Alternatives considered
|
|
115
119
|
|
|
116
120
|
- **Use a cloud secrets manager.** Rejected: cost (~$0.40/secret-month at AWS), latency (an extra network hop on cold start), single point of failure (the manager being down blocks deploys). At ~10 secrets and one operator, the filesystem-permissions model is cheaper and not meaningfully less secure.
|
|
117
121
|
- **Encrypt secrets in the repo (SOPS, git-crypt).** Rejected: shifts the problem from "don't commit the secret" to "don't lose the decryption key." The decryption key has to live somewhere; if it lives in the same repo, we've solved nothing; if it lives outside, we've reinvented the current `/etc/example/` model with extra steps.
|
|
118
|
-
- **Skip the
|
|
122
|
+
- **Skip the agent-side prevent hook; rely on CI alone.** Rejected: CI catches the leak after the secret has already been pushed to GitHub (where it's now in their cache, even if the PR closes). The PreToolUse prevent hook is the fast feedback that stops the leak before it ever reaches a commit.
|
|
119
123
|
|
|
120
124
|
## Consequences
|
|
121
125
|
|
|
122
|
-
- New builders go through a one-line orientation: "creds live in /etc/example on the droplet, in ~/.config/otb/env or .env.local on your laptop, nowhere else." If they ask "but what if I want to commit one?" — the hook blocks
|
|
123
|
-
- The
|
|
126
|
+
- New builders go through a one-line orientation: "creds live in /etc/example on the droplet, in ~/.config/otb/env or .env.local on your laptop, nowhere else." If they ask "but what if I want to commit one?" — the prevent hook blocks the write; if they push past it, the CI gitleaks gate blocks the merge; and anything already in history is caught by the weekly patrol.
|
|
127
|
+
- The prevent hook + CI gitleaks gate + weekly patrol are now load-bearing, and `scripts/gds/control-manifest.js` fails CI if any of them is removed or unwired. A change to any of them needs to update this ADR (and the manifest row) too, or the policy and the enforcement will drift — the exact drift this ADR's own rewrite corrected.
|
|
124
128
|
- Rotation is the operator's responsibility (Lars). The team is informed via the chat broadcast; there is no automatic distribution of new secrets to builder laptops. This is a deliberate accept-the-friction choice — automatic distribution requires a secrets manager.
|
package/docs/architecture.md
CHANGED
|
@@ -154,7 +154,13 @@ learnings(id, title, body_md, tags text[], related_files text[], captured_by, so
|
|
|
154
154
|
source_ref, task_id?, created_at)
|
|
155
155
|
indexes: GIN(tags), GIN(related_files), UNIQUE(source, source_ref) WHERE non-null
|
|
156
156
|
idea_inbox(id, title, body_md, kind, suggested_version, suggested_priority, captured_at,
|
|
157
|
-
captured_by, status 'open'|'promoted'|'discarded'|'merged', promoted_to_task_id, reviewed_at
|
|
157
|
+
captured_by, status 'open'|'promoted'|'discarded'|'merged', promoted_to_task_id, reviewed_at,
|
|
158
|
+
merged_into_idea_id? FK idea_inbox, triage_note?, -- mig core_195 (task 1002447): what a
|
|
159
|
+
-- triage VERDICT decided -- which idea a merge folded into, and why a discard happened.
|
|
160
|
+
-- CHECK (merged_into_idea_id IS NULL OR status = 'merged') -- no merge chains.
|
|
161
|
+
suggested_goal_id? FK goals ON DELETE SET NULL) -- mig core_222 (task 1003060, goal 1000071):
|
|
162
|
+
-- an ADVISORY routing hint for rows that did NOT convert (homeless/soft-landed/Discord).
|
|
163
|
+
-- The binding home for routed work is tasks.goal_id; nothing may gate on this column.
|
|
158
164
|
done_when_criteria(id, version_id, criterion_id, criterion_md, satisfied bool, satisfied_by_task_id,
|
|
159
165
|
checked_at, sort_order, UNIQUE(version_id, criterion_id)) -- 13 seeded (V1 + PMS-V2)
|
|
160
166
|
task_criteria(task_id FK tasks, criterion_id FK done_when_criteria, source 'backfill'|'manual'|'planning',
|
package/docs/file-map.md
CHANGED
|
@@ -388,6 +388,7 @@ tests/
|
|
|
388
388
|
<!-- BEGIN GENERATED FILE-MAP .claude/scheduled-tasks/ (scripts/gds/gen-file-map.js — do not hand-edit; notes live in docs/file-map.notes.json) -->
|
|
389
389
|
```
|
|
390
390
|
.claude/scheduled-tasks/
|
|
391
|
+
└── redteam-weekly/SKILL.md ← weekly deterministic red-team patrol (task 1003128): full-history gitleaks scan + dependency drift review (audit delta, cooldown, young pkgs, stale overrides) + action-pin check → files security reports (advisory, ADR 0162)
|
|
391
392
|
```
|
|
392
393
|
<!-- END GENERATED FILE-MAP .claude/scheduled-tasks/ -->
|
|
393
394
|
|
package/docs/handoff-template.md
CHANGED
|
@@ -89,4 +89,4 @@ This template forces:
|
|
|
89
89
|
|
|
90
90
|
## Old entries
|
|
91
91
|
|
|
92
|
-
There is **no per-session compaction chore** anymore. CLAUDE.md §13 shows only a generated, bounded recent-sessions snippet (older entries roll off it automatically) and the full history is the generated
|
|
92
|
+
There is **no per-session compaction chore** anymore. CLAUDE.md §13 shows only a generated, bounded recent-sessions snippet (older entries roll off it automatically) and the full history is the generated `docs/session-log-index.md` — neither is hand-maintained. Trimming very old prose from `docs/session-logs/` into `docs/session-log-archive.md` is optional on-disk housekeeping; it no longer affects the loaded-every-session context cost.
|
package/docs/recipes/README.md
CHANGED
|
@@ -17,7 +17,7 @@ A "recipe" is not a limitation (something the project cannot do). It is a multi-
|
|
|
17
17
|
|
|
18
18
|
- Architectural decisions → [`docs/adr/`](../../docs/adr/)
|
|
19
19
|
- Things the project cannot do → [`limitations/`](../../limitations/)
|
|
20
|
-
- Things stuck on the prompter's input →
|
|
20
|
+
- Things stuck on the prompter's input → the blockers queue (`POST /api/gds/blockers`, reviewed via `/blocker-review`)
|
|
21
21
|
|
|
22
22
|
## Read order while working
|
|
23
23
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# The weekly red-team patrol
|
|
2
|
+
|
|
3
|
+
**What it is.** The patrol layer of goal 1000076 (task 1003128): deterministic
|
|
4
|
+
scanners that run weekly and file findings into the security-reports
|
|
5
|
+
adjudication queue. It complements the two always-on layers — the agent-side
|
|
6
|
+
prevent hooks (task 1003125) and the CI merge gates (tasks 1003126/1003127/1003129)
|
|
7
|
+
— by covering what those can't: **git history**, **the network** (registry
|
|
8
|
+
metadata), and **slow sweeps**.
|
|
9
|
+
|
|
10
|
+
## Running it
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
node scripts/gds/redteam-patrol.js # dry run — print, file nothing
|
|
14
|
+
node scripts/gds/redteam-patrol.js --file # the weekly cron form — files reports
|
|
15
|
+
node scripts/gds/redteam-patrol.js --canary # self-test detection only
|
|
16
|
+
node scripts/gds/redteam-patrol.js --canary --file # prove the full pipe (files + dispute-closes)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The scheduled form lives at [`.claude/scheduled-tasks/redteam-weekly/`](../../.claude/scheduled-tasks/redteam-weekly/SKILL.md)
|
|
20
|
+
(`mode: deterministic`, one step, sink `gds`). Install on a machine per the
|
|
21
|
+
file-map convention: symlink the routine dir under `~/.claude/scheduled-tasks/`.
|
|
22
|
+
Weekly is the cadence — the checks watch drift measured in days (release-age,
|
|
23
|
+
new advisories), not minutes.
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
- **gitleaks** on PATH (`brew install gitleaks`) or `GITLEAKS_BIN=<path>`. The
|
|
28
|
+
history scan degrades LOUDLY (a printed warning, no silent skip) when absent;
|
|
29
|
+
the dependency + pin checks still run.
|
|
30
|
+
- A GDS session (the normal builder token) for `--file`; dry runs need nothing.
|
|
31
|
+
- Network access to the npm registry for the dependency checks — registry
|
|
32
|
+
failures print notes and skip that item (advisory layer: fail-open, loud).
|
|
33
|
+
|
|
34
|
+
## What a finding means
|
|
35
|
+
|
|
36
|
+
Reports land at `target: redteam-patrol/<class>` for Archon adjudication in the
|
|
37
|
+
red-team dashboard — confirm / dispute / link-fix, exactly like a
|
|
38
|
+
`/builder-redteam` filing (they share the pipeline and the bounty table; patrol
|
|
39
|
+
reports are machine-filed, so confirming one pays nobody). The fix is always an
|
|
40
|
+
ordinary task; the patrol never gates and never self-executes (ADR 0162).
|
|
41
|
+
|
|
42
|
+
## Design boundaries
|
|
43
|
+
|
|
44
|
+
Deterministic only — AI review was deliberately deferred (owner decision
|
|
45
|
+
2026-08-18, recorded on the goal). One report per finding class per run keeps
|
|
46
|
+
the queue at 0–3 rows weekly. Severity mapping: npm's `moderate` files as
|
|
47
|
+
`medium` (the bounty table's vocabulary). Caps: 10 itemized findings per report
|
|
48
|
+
body, the rest counted.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
-- core_222_idea_inbox_suggested_goal.sql — a routing HINT on an inbox row
|
|
2
|
+
-- (task 1003060, BV1.R02, goal 1000071 "Idea routing").
|
|
3
|
+
--
|
|
4
|
+
-- WHAT THIS IS NOT. This is not where a routed idea's goal lives. When routing
|
|
5
|
+
-- fires, the idea is converted in the same transaction (R01): the idea row goes
|
|
6
|
+
-- status='promoted' with promoted_to_task_id set, and the TASK carries the real
|
|
7
|
+
-- goal_id. The binding home for "which goal does this work belong to" is
|
|
8
|
+
-- tasks.goal_id — always. This column is strictly the ADVISORY leftover for rows
|
|
9
|
+
-- that did NOT convert:
|
|
10
|
+
-- * soft-landed / homeless ideas that stayed in the inbox (no goal at filing),
|
|
11
|
+
-- * Discord #ideas inbound carrying a classifier's guess (R12),
|
|
12
|
+
-- * Full Ideas and criterion-proposals, which never auto-route by design,
|
|
13
|
+
-- so /idea-triage can show "this probably belongs to goal N" instead of making
|
|
14
|
+
-- every triage pass re-derive it. A hint is nullable, overwritable, and load-
|
|
15
|
+
-- bearing for NOTHING — no rank check, no scope wall, and no payout may read it.
|
|
16
|
+
--
|
|
17
|
+
-- WHY CORE, NOT modules/ideas/migrations/. `idea_inbox` is a CORE table. A module
|
|
18
|
+
-- migration may only touch its own <key>_-prefixed objects — fitness.js
|
|
19
|
+
-- checkModuleMigrationsAdditive hard-fails an `ALTER TABLE idea_inbox` from a
|
|
20
|
+
-- module (ADR 0083 §Decision #5). Same reasoning core_195 recorded when it added
|
|
21
|
+
-- merged_into_idea_id: the ideas module owns every QUERY against this table and
|
|
22
|
+
-- none of its schema. The lineage half of R02 — which touches an ideas-OWNED
|
|
23
|
+
-- table — is correctly a module migration (ideas_003).
|
|
24
|
+
--
|
|
25
|
+
-- WHY ON DELETE SET NULL. A hint must never keep a goal alive nor block its
|
|
26
|
+
-- deletion, and a dangling hint is worse than no hint: an archived-then-deleted
|
|
27
|
+
-- goal would otherwise leave triage pointing at a tombstone. RESTRICT would let
|
|
28
|
+
-- an advisory column veto a goal deletion, which inverts the whole point.
|
|
29
|
+
--
|
|
30
|
+
-- Additive, nullable, idempotent (safe to re-run). Forward-safe by construction:
|
|
31
|
+
-- every existing reader SELECTs an explicit column list, so old code on the new
|
|
32
|
+
-- schema neither sees nor needs this (tests/migrations_forward_safe.mjs).
|
|
33
|
+
|
|
34
|
+
BEGIN;
|
|
35
|
+
|
|
36
|
+
ALTER TABLE idea_inbox
|
|
37
|
+
ADD COLUMN IF NOT EXISTS suggested_goal_id bigint REFERENCES goals(id) ON DELETE SET NULL;
|
|
38
|
+
|
|
39
|
+
-- Triage's homeless-only walk (R13) filters "open ideas that have a hint" and
|
|
40
|
+
-- the reverse "what is pointed at this goal". Partial: the overwhelming majority
|
|
41
|
+
-- of rows are NULL (no hint), so a partial index stays small and still serves
|
|
42
|
+
-- both directions.
|
|
43
|
+
--
|
|
44
|
+
-- NOT CONCURRENTLY, and it cannot be: CREATE INDEX CONCURRENTLY is forbidden
|
|
45
|
+
-- inside a transaction block, and this migration is wrapped BEGIN/COMMIT so the
|
|
46
|
+
-- column and its index land atomically (a half-applied migration is the worse
|
|
47
|
+
-- failure). The plain form takes a brief ACCESS EXCLUSIVE lock on idea_inbox for
|
|
48
|
+
-- the duration of the build. That is acceptable HERE specifically because
|
|
49
|
+
-- idea_inbox is a low-volume human-filing queue — ideas arrive at human pace, not
|
|
50
|
+
-- per-request — so the build is milliseconds against a small table and no write
|
|
51
|
+
-- path of consequence blocks. This reasoning does NOT generalise: a future index
|
|
52
|
+
-- on a write-hot table wants CONCURRENTLY in its OWN transaction-less migration.
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_idea_inbox_suggested_goal
|
|
54
|
+
ON idea_inbox (suggested_goal_id)
|
|
55
|
+
WHERE suggested_goal_id IS NOT NULL;
|
|
56
|
+
|
|
57
|
+
COMMIT;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
-- ideas_003_lineage_origin_route.sql — 'route' becomes a legal lineage origin
|
|
2
|
+
-- (task 1003060, BV1.R02, goal 1000071 "Idea routing").
|
|
3
|
+
--
|
|
4
|
+
-- WHY. ideas_002 created ideas_task_lineage with origin IN ('promote','develop')
|
|
5
|
+
-- — the two ways a task could descend from an idea when it was written. Routing
|
|
6
|
+
-- adds a THIRD: capture-time promotion, where the idea row and its task are
|
|
7
|
+
-- written in one transaction at filing time (R01) rather than by a later triage
|
|
8
|
+
-- promote. That is genuinely a different provenance and must be distinguishable
|
|
9
|
+
-- in the ledger: 'promote' means a human triaged it, 'route' means the filer
|
|
10
|
+
-- named a goal and the system converted it on the spot. Collapsing the two would
|
|
11
|
+
-- destroy the only signal that tells us how much triage routing actually saved
|
|
12
|
+
-- (C6 triage-shrinks-to-judgment) — and IC4 may want to weigh them differently.
|
|
13
|
+
--
|
|
14
|
+
-- WHY THE WHOLE POINT IS ATTRIBUTION. Discord #bugs is the cautionary tale this
|
|
15
|
+
-- goal exists to fix: it creates tasks DIRECTLY, skipping idea_inbox, so there is
|
|
16
|
+
-- no captured_by and no lineage row — the ideator-credit lane (goal 1000067) has
|
|
17
|
+
-- nothing to ever pay against. Routing must never become a second such bypass, so
|
|
18
|
+
-- every routed task gets a lineage row like any other. This CHECK is what lets it.
|
|
19
|
+
--
|
|
20
|
+
-- WHY THIS IS ADDITIVE DESPITE THE `DROP CONSTRAINT`. Postgres has no "extend a
|
|
21
|
+
-- CHECK" verb; widening an enum-style CHECK is necessarily drop-then-re-add of
|
|
22
|
+
-- the SAME-named constraint. That is additive in EFFECT — the new predicate
|
|
23
|
+
-- permits a strict superset of the old one, so no existing row can be
|
|
24
|
+
-- invalidated and no data is touched. fitness.js recognises exactly this shape
|
|
25
|
+
-- (isConstraintWidening, task 1978): a DROP whose constraint name is re-ADDed in
|
|
26
|
+
-- the same file is exempt from the destructive-DDL rule. The name must therefore
|
|
27
|
+
-- match Postgres's auto-generated name from the ideas_002 inline column CHECK —
|
|
28
|
+
-- ideas_task_lineage_origin_check — or the exemption does not apply and the
|
|
29
|
+
-- constraint silently does not come back. provisioning_003 is the precedent.
|
|
30
|
+
--
|
|
31
|
+
-- Module migrations are ADDITIVE and NAMESPACED: every object here is
|
|
32
|
+
-- ideas_-prefixed, no down-migration, idempotent (safe to re-run).
|
|
33
|
+
|
|
34
|
+
BEGIN;
|
|
35
|
+
|
|
36
|
+
ALTER TABLE ideas_task_lineage DROP CONSTRAINT IF EXISTS ideas_task_lineage_origin_check;
|
|
37
|
+
ALTER TABLE ideas_task_lineage ADD CONSTRAINT ideas_task_lineage_origin_check
|
|
38
|
+
CHECK (origin IN ('promote', 'develop', 'route'));
|
|
39
|
+
|
|
40
|
+
-- SAFETY NET — did the widening actually take? If ideas_002's inline CHECK ever
|
|
41
|
+
-- carried a name other than Postgres's auto-generated ideas_task_lineage_origin_check,
|
|
42
|
+
-- the DROP above silently no-ops and the ADD installs a SECOND constraint while the
|
|
43
|
+
-- original keeps rejecting 'route' — routing would then fail at runtime, in the one
|
|
44
|
+
-- transaction whose whole job is preserving attribution, with nothing pointing here.
|
|
45
|
+
-- A migration that cannot prove its own effect must not report success. Read-only,
|
|
46
|
+
-- no DDL: it asserts that no surviving CHECK on this table still excludes 'route'.
|
|
47
|
+
DO $$
|
|
48
|
+
DECLARE stale text;
|
|
49
|
+
BEGIN
|
|
50
|
+
SELECT string_agg(conname, ', ') INTO stale
|
|
51
|
+
FROM pg_constraint
|
|
52
|
+
WHERE conrelid = 'ideas_task_lineage'::regclass
|
|
53
|
+
AND contype = 'c'
|
|
54
|
+
AND pg_get_constraintdef(oid) ILIKE '%origin%'
|
|
55
|
+
AND pg_get_constraintdef(oid) NOT ILIKE '%route%';
|
|
56
|
+
IF stale IS NOT NULL THEN
|
|
57
|
+
RAISE EXCEPTION
|
|
58
|
+
'ideas_003: CHECK constraint(s) % still reject origin=''route'' — the widening did not take (name mismatch with ideas_002). Rename the DROP target to match and re-run.', stale;
|
|
59
|
+
END IF;
|
|
60
|
+
END $$;
|
|
61
|
+
|
|
62
|
+
COMMIT;
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.259",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.259",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.259",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|