@bongos/core 1.24.22 → 1.24.24

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 (88) hide show
  1. package/.bongos-core.json +218 -63
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +42 -0
  4. package/clients/bongos-client/index.cjs +42 -0
  5. package/clients/bongos-client/index.d.ts +55 -1
  6. package/clients/bongos-client/index.mjs +42 -0
  7. package/docs/api/openapi.json +1181 -207
  8. package/docs/api-reference.md +30 -5
  9. package/docs/architecture.md +42 -0
  10. package/docs/copy-inventory.md +18 -8
  11. package/docs/copy-registry.json +99 -9
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/page-readings.json +64 -25
  14. package/migrations/core_291_payout_nda_tax.sql +75 -0
  15. package/migrations/core_292_module_sale_payouts.sql +170 -0
  16. package/migrations/core_293_cash_outs.sql +184 -0
  17. package/migrations/core_294_cash_out_attempts_sent_by_time.sql +21 -0
  18. package/modules/economy/ledger-check.js +360 -0
  19. package/modules/economy/migrations/economy_003_user_balances.sql +116 -0
  20. package/modules/economy/migrations/economy_004_module_share_payouts.sql +22 -0
  21. package/modules/economy/migrations/economy_005_project_account_holds_index.sql +20 -0
  22. package/modules/economy/migrations/economy_006_ledger_checks.sql +68 -0
  23. package/modules/economy/module.json +1 -1
  24. package/modules/economy/outflow.js +209 -0
  25. package/modules/economy/pollers/ledger-check.js +87 -0
  26. package/modules/economy/project-account.js +92 -7
  27. package/modules/economy/routes/balances.js +79 -0
  28. package/modules/economy/routes/project-account.js +40 -2
  29. package/modules/economy/user-balances.js +308 -0
  30. package/modules/government/decision-rules.js +1 -0
  31. package/modules/hall-ui/public/project-settings.css +18 -0
  32. package/modules/hall-ui/public/project-settings.html +15 -2
  33. package/modules/hall-ui/public/project-settings.js +142 -0
  34. package/modules/ideas/module.json +2 -1
  35. package/modules/ideas/routes/blockers.js +26 -0
  36. package/modules/lifecycle/db-claims.js +22 -0
  37. package/modules/lifecycle/db-ship.js +5 -5
  38. package/modules/lifecycle/funding-wall.js +253 -0
  39. package/modules/lifecycle/module.json +2 -1
  40. package/modules/lifecycle/routes/claims.js +9 -0
  41. package/modules/lifecycle/routes/pay-type-gates.js +7 -0
  42. package/modules/lifecycle/routes/project-settings.js +59 -2
  43. package/modules/onboarding/founding-birth.js +5 -2
  44. package/modules/onboarding/founding-mode.js +10 -0
  45. package/modules/onboarding/genesis-home.js +3 -0
  46. package/modules/provisioning/birth.js +11 -2
  47. package/package-lock.json +2 -2
  48. package/package.json +1 -1
  49. package/release-notes.json +44 -0
  50. package/scripts/bongos/government-walk.js +1 -0
  51. package/scripts/bongos/plain-cards.js +18 -0
  52. package/scripts/bongos/run-unit-tests.js +28 -0
  53. package/src/bongos/builder-payouts.js +6 -1
  54. package/src/bongos/cash-outs.js +399 -0
  55. package/src/bongos/module-payouts.js +432 -0
  56. package/src/bongos/payout-approvals.js +5 -2
  57. package/src/bongos/payout-gates.js +44 -7
  58. package/src/bongos/project-settings.js +2 -0
  59. package/src/bongos/routes/module-payouts.js +114 -0
  60. package/src/bongos/routes/my-cash-outs.js +103 -0
  61. package/src/bongos/routes/payout-gates.js +42 -1
  62. package/src/bongos/routes.js +6 -0
  63. package/src/branding.js +3 -0
  64. package/src/module-api.js +1 -1
  65. package/tests/builder_payouts_db.mjs +1 -0
  66. package/tests/cash_outs.mjs +96 -0
  67. package/tests/cash_outs_db.mjs +205 -0
  68. package/tests/founding_birth.mjs +52 -12
  69. package/tests/founding_mode.mjs +5 -5
  70. package/tests/funded_project_pays_proof_db.mjs +181 -0
  71. package/tests/funding_wall.mjs +205 -0
  72. package/tests/funding_wall_db.mjs +174 -0
  73. package/tests/genesis_home.mjs +1 -1
  74. package/tests/government_act_alone_buildings.mjs +1 -0
  75. package/tests/ledger_check.mjs +189 -0
  76. package/tests/ledger_check_db.mjs +119 -0
  77. package/tests/module_payouts.mjs +295 -0
  78. package/tests/module_payouts_db.mjs +140 -0
  79. package/tests/own_scope_guard.mjs +5 -0
  80. package/tests/payout_gates.mjs +67 -6
  81. package/tests/payout_gates_db.mjs +23 -1
  82. package/tests/project_account_db.mjs +5 -2
  83. package/tests/project_outflow.mjs +103 -0
  84. package/tests/project_outflow_db.mjs +100 -0
  85. package/tests/provision_settings_apply.mjs +2 -1
  86. package/tests/provisioning_settings_env.mjs +7 -3
  87. package/tests/user_balances.mjs +241 -0
  88. package/tests/user_balances_db.mjs +137 -0
@@ -65,6 +65,10 @@
65
65
  "name": "backup",
66
66
  "description": "Endpoints under `/api/bongos/backup`."
67
67
  },
68
+ {
69
+ "name": "balances",
70
+ "description": "Endpoints under `/api/bongos/balances`."
71
+ },
68
72
  {
69
73
  "name": "blockers",
70
74
  "description": "Endpoints under `/api/bongos/blockers`."
@@ -3075,6 +3079,130 @@
3075
3079
  ]
3076
3080
  }
3077
3081
  },
3082
+ "/balances/fund-project": {
3083
+ "post": {
3084
+ "operationId": "post_balances_fund_project",
3085
+ "tags": [
3086
+ "balances"
3087
+ ],
3088
+ "summary": "POST /balances/fund-project",
3089
+ "description": "a person funds this project from their own account, on their own web session.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
3090
+ "x-rank": "any-builder",
3091
+ "x-source": "modules/economy/routes/balances.js",
3092
+ "responses": {
3093
+ "200": {
3094
+ "description": "Success."
3095
+ },
3096
+ "400": {
3097
+ "$ref": "#/components/responses/BadRequest"
3098
+ },
3099
+ "401": {
3100
+ "$ref": "#/components/responses/Unauthorized"
3101
+ },
3102
+ "403": {
3103
+ "$ref": "#/components/responses/Forbidden"
3104
+ }
3105
+ },
3106
+ "security": [
3107
+ {
3108
+ "builderSession": []
3109
+ }
3110
+ ]
3111
+ }
3112
+ },
3113
+ "/balances/me": {
3114
+ "get": {
3115
+ "operationId": "get_balances_me",
3116
+ "tags": [
3117
+ "balances"
3118
+ ],
3119
+ "summary": "GET /balances/me",
3120
+ "description": "the signed-in person's own balance and their own payments.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
3121
+ "x-rank": "any-builder",
3122
+ "x-source": "modules/economy/routes/balances.js",
3123
+ "responses": {
3124
+ "200": {
3125
+ "description": "Success."
3126
+ },
3127
+ "400": {
3128
+ "$ref": "#/components/responses/BadRequest"
3129
+ },
3130
+ "401": {
3131
+ "$ref": "#/components/responses/Unauthorized"
3132
+ },
3133
+ "403": {
3134
+ "$ref": "#/components/responses/Forbidden"
3135
+ }
3136
+ },
3137
+ "security": [
3138
+ {
3139
+ "builderSession": []
3140
+ }
3141
+ ]
3142
+ }
3143
+ },
3144
+ "/balances/pay": {
3145
+ "post": {
3146
+ "operationId": "post_balances_pay",
3147
+ "tags": [
3148
+ "balances"
3149
+ ],
3150
+ "summary": "POST /balances/pay",
3151
+ "description": "a person pays another member of this project from their own account.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
3152
+ "x-rank": "any-builder",
3153
+ "x-source": "modules/economy/routes/balances.js",
3154
+ "responses": {
3155
+ "200": {
3156
+ "description": "Success."
3157
+ },
3158
+ "400": {
3159
+ "$ref": "#/components/responses/BadRequest"
3160
+ },
3161
+ "401": {
3162
+ "$ref": "#/components/responses/Unauthorized"
3163
+ },
3164
+ "403": {
3165
+ "$ref": "#/components/responses/Forbidden"
3166
+ }
3167
+ },
3168
+ "security": [
3169
+ {
3170
+ "builderSession": []
3171
+ }
3172
+ ]
3173
+ }
3174
+ },
3175
+ "/balances/project": {
3176
+ "get": {
3177
+ "operationId": "get_balances_project",
3178
+ "tags": [
3179
+ "balances"
3180
+ ],
3181
+ "summary": "GET /balances/project",
3182
+ "description": "the project's balance figure, so a member can see whether it needs funding.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
3183
+ "x-rank": "any-builder",
3184
+ "x-source": "modules/economy/routes/balances.js",
3185
+ "responses": {
3186
+ "200": {
3187
+ "description": "Success."
3188
+ },
3189
+ "400": {
3190
+ "$ref": "#/components/responses/BadRequest"
3191
+ },
3192
+ "401": {
3193
+ "$ref": "#/components/responses/Unauthorized"
3194
+ },
3195
+ "403": {
3196
+ "$ref": "#/components/responses/Forbidden"
3197
+ }
3198
+ },
3199
+ "security": [
3200
+ {
3201
+ "builderSession": []
3202
+ }
3203
+ ]
3204
+ }
3205
+ },
3078
3206
  "/blockers": {
3079
3207
  "get": {
3080
3208
  "operationId": "get_blockers",
@@ -14678,40 +14806,22 @@
14678
14806
  ]
14679
14807
  }
14680
14808
  },
14681
- "/me/checkout-freshness": {
14682
- "patch": {
14683
- "operationId": "patch_me_checkout_freshness",
14809
+ "/me/cash-outs": {
14810
+ "get": {
14811
+ "operationId": "get_me_cash_outs",
14684
14812
  "tags": [
14685
14813
  "me"
14686
14814
  ],
14687
- "summary": "PATCH /me/checkout-freshness",
14688
- "description": "How far behind this builder's local project folder is (task 1005021, checkout-freshness.js). Written by their own session start; read back by GET /me, which tells the person (and their agent) when the folder could not update itself. Body: { behind, branch, reason }. rank: any-builder — a builder's own report about their own computer; same posture as /me/core-move-seen.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14815
+ "summary": "GET /me/cash-outs",
14816
+ "description": "GET /api/bongos/me/cash-outs — my withdrawals and where each stands.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14689
14817
  "x-rank": "any-builder",
14690
- "x-source": "modules/builder-settings/routes/settings.js",
14691
- "requestBody": {
14692
- "required": true,
14693
- "content": {
14694
- "application/json": {
14695
- "schema": {
14696
- "$ref": "#/components/schemas/PatchMeCheckoutFreshnessRequest"
14697
- }
14698
- }
14699
- },
14700
- "x-validated": true
14701
- },
14818
+ "x-source": "src/bongos/routes/my-cash-outs.js",
14702
14819
  "responses": {
14703
14820
  "200": {
14704
- "description": "Success.",
14705
- "content": {
14706
- "application/json": {
14707
- "schema": {
14708
- "$ref": "#/components/schemas/PatchMeCheckoutFreshnessResponse"
14709
- }
14710
- }
14711
- }
14821
+ "description": "Success."
14712
14822
  },
14713
14823
  "400": {
14714
- "$ref": "#/components/responses/ValidationFailed"
14824
+ "$ref": "#/components/responses/BadRequest"
14715
14825
  },
14716
14826
  "401": {
14717
14827
  "$ref": "#/components/responses/Unauthorized"
@@ -14725,24 +14835,22 @@
14725
14835
  "builderSession": []
14726
14836
  }
14727
14837
  ]
14728
- }
14729
- },
14730
- "/me/core-move-seen": {
14731
- "patch": {
14732
- "operationId": "patch_me_core_move_seen",
14838
+ },
14839
+ "post": {
14840
+ "operationId": "post_me_cash_outs",
14733
14841
  "tags": [
14734
14842
  "me"
14735
14843
  ],
14736
- "summary": "PATCH /me/core-move-seen",
14737
- "description": "The core move this builder has been told about (task 1004731, core-move-seen.js): closing the hall's \"Upgraded to core X\" notice stores that move's ledger id here, so it is not shown to them again on any device. Body: { id: \"<core_upgrades row id>\" }. rank: any-builder — own acknowledgement; same posture as /me/profile-nudge.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14844
+ "summary": "POST /me/cash-outs",
14845
+ "description": "POST /api/bongos/me/cash-outs — ask to take amount_cents of my balance to my bank.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14738
14846
  "x-rank": "any-builder",
14739
- "x-source": "modules/builder-settings/routes/settings.js",
14847
+ "x-source": "src/bongos/routes/my-cash-outs.js",
14740
14848
  "requestBody": {
14741
14849
  "required": true,
14742
14850
  "content": {
14743
14851
  "application/json": {
14744
14852
  "schema": {
14745
- "$ref": "#/components/schemas/PatchMeCoreMoveSeenRequest"
14853
+ "$ref": "#/components/schemas/PostMeCashOutsRequest"
14746
14854
  }
14747
14855
  }
14748
14856
  },
@@ -14750,14 +14858,7 @@
14750
14858
  },
14751
14859
  "responses": {
14752
14860
  "200": {
14753
- "description": "Success.",
14754
- "content": {
14755
- "application/json": {
14756
- "schema": {
14757
- "$ref": "#/components/schemas/PatchMeCoreMoveSeenResponse"
14758
- }
14759
- }
14760
- }
14861
+ "description": "Success."
14761
14862
  },
14762
14863
  "400": {
14763
14864
  "$ref": "#/components/responses/ValidationFailed"
@@ -14776,16 +14877,27 @@
14776
14877
  ]
14777
14878
  }
14778
14879
  },
14779
- "/me/credits": {
14780
- "get": {
14781
- "operationId": "get_me_credits",
14880
+ "/me/cash-outs/{id}/cancel": {
14881
+ "post": {
14882
+ "operationId": "post_me_cash_outs_id_cancel",
14782
14883
  "tags": [
14783
14884
  "me"
14784
14885
  ],
14785
- "summary": "GET /me/credits",
14786
- "description": "GET /me/credits — the caller's own ledger. rank: any-builder — own-scoped by construction: the builder id comes from the authenticated session and is never read off the request, so there is no parameter here to tamper with. A builder may always read their own ledger; gating this any higher would mean a Xenos cannot see what they were paid.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14886
+ "summary": "POST /me/cash-outs/:id/cancel",
14887
+ "description": "POST /api/bongos/me/cash-outs/:id/cancel — withdraw one of my requests that has not been sent.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14787
14888
  "x-rank": "any-builder",
14788
- "x-source": "modules/economy/routes/credits.js",
14889
+ "x-source": "src/bongos/routes/my-cash-outs.js",
14890
+ "parameters": [
14891
+ {
14892
+ "name": "id",
14893
+ "in": "path",
14894
+ "required": true,
14895
+ "schema": {
14896
+ "type": "string"
14897
+ },
14898
+ "description": "Path parameter `id`."
14899
+ }
14900
+ ],
14789
14901
  "responses": {
14790
14902
  "200": {
14791
14903
  "description": "Success."
@@ -14798,6 +14910,9 @@
14798
14910
  },
14799
14911
  "403": {
14800
14912
  "$ref": "#/components/responses/Forbidden"
14913
+ },
14914
+ "404": {
14915
+ "$ref": "#/components/responses/NotFound"
14801
14916
  }
14802
14917
  },
14803
14918
  "security": [
@@ -14807,82 +14922,42 @@
14807
14922
  ]
14808
14923
  }
14809
14924
  },
14810
- "/me/cross-project": {
14811
- "get": {
14812
- "operationId": "get_me_cross_project",
14925
+ "/me/cash-outs/{id}/retry": {
14926
+ "post": {
14927
+ "operationId": "post_me_cash_outs_id_retry",
14813
14928
  "tags": [
14814
14929
  "me"
14815
14930
  ],
14816
- "summary": "GET /me/cross-project",
14817
- "description": "the caller's OWN cross-project record + privacy flags (own data).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14931
+ "summary": "POST /me/cash-outs/:id/retry",
14932
+ "description": "POST /api/bongos/me/cash-outs/:id/retry — try one of my unfinished withdrawals again.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14818
14933
  "x-rank": "any-builder",
14819
- "x-source": "modules/platform-identity/routes/profile.js",
14820
- "responses": {
14821
- "200": {
14822
- "description": "Success.",
14823
- "content": {
14824
- "application/json": {
14825
- "schema": {
14826
- "$ref": "#/components/schemas/GetMeCrossProjectResponse"
14827
- }
14828
- }
14829
- }
14830
- },
14831
- "400": {
14832
- "$ref": "#/components/responses/BadRequest"
14833
- },
14834
- "401": {
14835
- "$ref": "#/components/responses/Unauthorized"
14836
- },
14837
- "403": {
14838
- "$ref": "#/components/responses/Forbidden"
14839
- }
14840
- },
14841
- "security": [
14934
+ "x-source": "src/bongos/routes/my-cash-outs.js",
14935
+ "parameters": [
14842
14936
  {
14843
- "builderSession": []
14937
+ "name": "id",
14938
+ "in": "path",
14939
+ "required": true,
14940
+ "schema": {
14941
+ "type": "string"
14942
+ },
14943
+ "description": "Path parameter `id`."
14844
14944
  }
14845
- ]
14846
- },
14847
- "patch": {
14848
- "operationId": "patch_me_cross_project",
14849
- "tags": [
14850
- "me"
14851
14945
  ],
14852
- "summary": "PATCH /me/cross-project",
14853
- "description": "flip the caller's OWN privacy flags (C2's self-serve opt-out plus the task-1002966 pair; own data, keyed on the authenticated github_id — a builder can never name another account here). Every field is optional and at least one is required, so a client sends only what changed; recruiter_discoverable accepts an explicit null (reset to \"follow visibility\"), which is why it is checked with `in` rather than truthiness.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14854
- "x-rank": "any-builder",
14855
- "x-source": "modules/platform-identity/routes/profile.js",
14856
- "requestBody": {
14857
- "required": false,
14858
- "content": {
14859
- "application/json": {
14860
- "schema": {
14861
- "$ref": "#/components/schemas/PatchMeCrossProjectRequest"
14862
- }
14863
- }
14864
- },
14865
- "x-validated": true
14866
- },
14867
14946
  "responses": {
14868
14947
  "200": {
14869
- "description": "Success.",
14870
- "content": {
14871
- "application/json": {
14872
- "schema": {
14873
- "$ref": "#/components/schemas/PatchMeCrossProjectResponse"
14874
- }
14875
- }
14876
- }
14948
+ "description": "Success."
14877
14949
  },
14878
14950
  "400": {
14879
- "$ref": "#/components/responses/ValidationFailed"
14951
+ "$ref": "#/components/responses/BadRequest"
14880
14952
  },
14881
14953
  "401": {
14882
14954
  "$ref": "#/components/responses/Unauthorized"
14883
14955
  },
14884
14956
  "403": {
14885
14957
  "$ref": "#/components/responses/Forbidden"
14958
+ },
14959
+ "404": {
14960
+ "$ref": "#/components/responses/NotFound"
14886
14961
  }
14887
14962
  },
14888
14963
  "security": [
@@ -14892,22 +14967,22 @@
14892
14967
  ]
14893
14968
  }
14894
14969
  },
14895
- "/me/disciplines": {
14970
+ "/me/checkout-freshness": {
14896
14971
  "patch": {
14897
- "operationId": "patch_me_disciplines",
14972
+ "operationId": "patch_me_checkout_freshness",
14898
14973
  "tags": [
14899
14974
  "me"
14900
14975
  ],
14901
- "summary": "PATCH /me/disciplines",
14902
- "description": "Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). Body: { preferred_disciplines: [\"artist\", ...] }. Valid elements are whatever enabledDisciplines() offers — engineer|ideator core plus any enabled module's (artist, ui); [] clears the preference (a multi-element set just means several lanes). No rank gate — a builder owns their own profile. 422 invalid_discipline if any element is out of range. rank: any-builder — self-service profile edit; documented \"no rank gate\" in the handler comment above (a builder owns their own preference). `main_discipline` (optional, task 1004433): the builder's own MAIN role, one of the crafts in the same body; null clears it, absent keeps it (see db.updateBuilderDisciplines). 422 invalid_main_discipline otherwise.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14976
+ "summary": "PATCH /me/checkout-freshness",
14977
+ "description": "How far behind this builder's local project folder is (task 1005021, checkout-freshness.js). Written by their own session start; read back by GET /me, which tells the person (and their agent) when the folder could not update itself. Body: { behind, branch, reason }. rank: any-builder — a builder's own report about their own computer; same posture as /me/core-move-seen.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14903
14978
  "x-rank": "any-builder",
14904
- "x-source": "src/bongos/routes/me.js",
14979
+ "x-source": "modules/builder-settings/routes/settings.js",
14905
14980
  "requestBody": {
14906
14981
  "required": true,
14907
14982
  "content": {
14908
14983
  "application/json": {
14909
14984
  "schema": {
14910
- "$ref": "#/components/schemas/PatchMeDisciplinesRequest"
14985
+ "$ref": "#/components/schemas/PatchMeCheckoutFreshnessRequest"
14911
14986
  }
14912
14987
  }
14913
14988
  },
@@ -14919,7 +14994,221 @@
14919
14994
  "content": {
14920
14995
  "application/json": {
14921
14996
  "schema": {
14922
- "$ref": "#/components/schemas/PatchMeDisciplinesResponse"
14997
+ "$ref": "#/components/schemas/PatchMeCheckoutFreshnessResponse"
14998
+ }
14999
+ }
15000
+ }
15001
+ },
15002
+ "400": {
15003
+ "$ref": "#/components/responses/ValidationFailed"
15004
+ },
15005
+ "401": {
15006
+ "$ref": "#/components/responses/Unauthorized"
15007
+ },
15008
+ "403": {
15009
+ "$ref": "#/components/responses/Forbidden"
15010
+ }
15011
+ },
15012
+ "security": [
15013
+ {
15014
+ "builderSession": []
15015
+ }
15016
+ ]
15017
+ }
15018
+ },
15019
+ "/me/core-move-seen": {
15020
+ "patch": {
15021
+ "operationId": "patch_me_core_move_seen",
15022
+ "tags": [
15023
+ "me"
15024
+ ],
15025
+ "summary": "PATCH /me/core-move-seen",
15026
+ "description": "The core move this builder has been told about (task 1004731, core-move-seen.js): closing the hall's \"Upgraded to core X\" notice stores that move's ledger id here, so it is not shown to them again on any device. Body: { id: \"<core_upgrades row id>\" }. rank: any-builder — own acknowledgement; same posture as /me/profile-nudge.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
15027
+ "x-rank": "any-builder",
15028
+ "x-source": "modules/builder-settings/routes/settings.js",
15029
+ "requestBody": {
15030
+ "required": true,
15031
+ "content": {
15032
+ "application/json": {
15033
+ "schema": {
15034
+ "$ref": "#/components/schemas/PatchMeCoreMoveSeenRequest"
15035
+ }
15036
+ }
15037
+ },
15038
+ "x-validated": true
15039
+ },
15040
+ "responses": {
15041
+ "200": {
15042
+ "description": "Success.",
15043
+ "content": {
15044
+ "application/json": {
15045
+ "schema": {
15046
+ "$ref": "#/components/schemas/PatchMeCoreMoveSeenResponse"
15047
+ }
15048
+ }
15049
+ }
15050
+ },
15051
+ "400": {
15052
+ "$ref": "#/components/responses/ValidationFailed"
15053
+ },
15054
+ "401": {
15055
+ "$ref": "#/components/responses/Unauthorized"
15056
+ },
15057
+ "403": {
15058
+ "$ref": "#/components/responses/Forbidden"
15059
+ }
15060
+ },
15061
+ "security": [
15062
+ {
15063
+ "builderSession": []
15064
+ }
15065
+ ]
15066
+ }
15067
+ },
15068
+ "/me/credits": {
15069
+ "get": {
15070
+ "operationId": "get_me_credits",
15071
+ "tags": [
15072
+ "me"
15073
+ ],
15074
+ "summary": "GET /me/credits",
15075
+ "description": "GET /me/credits — the caller's own ledger. rank: any-builder — own-scoped by construction: the builder id comes from the authenticated session and is never read off the request, so there is no parameter here to tamper with. A builder may always read their own ledger; gating this any higher would mean a Xenos cannot see what they were paid.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
15076
+ "x-rank": "any-builder",
15077
+ "x-source": "modules/economy/routes/credits.js",
15078
+ "responses": {
15079
+ "200": {
15080
+ "description": "Success."
15081
+ },
15082
+ "400": {
15083
+ "$ref": "#/components/responses/BadRequest"
15084
+ },
15085
+ "401": {
15086
+ "$ref": "#/components/responses/Unauthorized"
15087
+ },
15088
+ "403": {
15089
+ "$ref": "#/components/responses/Forbidden"
15090
+ }
15091
+ },
15092
+ "security": [
15093
+ {
15094
+ "builderSession": []
15095
+ }
15096
+ ]
15097
+ }
15098
+ },
15099
+ "/me/cross-project": {
15100
+ "get": {
15101
+ "operationId": "get_me_cross_project",
15102
+ "tags": [
15103
+ "me"
15104
+ ],
15105
+ "summary": "GET /me/cross-project",
15106
+ "description": "the caller's OWN cross-project record + privacy flags (own data).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
15107
+ "x-rank": "any-builder",
15108
+ "x-source": "modules/platform-identity/routes/profile.js",
15109
+ "responses": {
15110
+ "200": {
15111
+ "description": "Success.",
15112
+ "content": {
15113
+ "application/json": {
15114
+ "schema": {
15115
+ "$ref": "#/components/schemas/GetMeCrossProjectResponse"
15116
+ }
15117
+ }
15118
+ }
15119
+ },
15120
+ "400": {
15121
+ "$ref": "#/components/responses/BadRequest"
15122
+ },
15123
+ "401": {
15124
+ "$ref": "#/components/responses/Unauthorized"
15125
+ },
15126
+ "403": {
15127
+ "$ref": "#/components/responses/Forbidden"
15128
+ }
15129
+ },
15130
+ "security": [
15131
+ {
15132
+ "builderSession": []
15133
+ }
15134
+ ]
15135
+ },
15136
+ "patch": {
15137
+ "operationId": "patch_me_cross_project",
15138
+ "tags": [
15139
+ "me"
15140
+ ],
15141
+ "summary": "PATCH /me/cross-project",
15142
+ "description": "flip the caller's OWN privacy flags (C2's self-serve opt-out plus the task-1002966 pair; own data, keyed on the authenticated github_id — a builder can never name another account here). Every field is optional and at least one is required, so a client sends only what changed; recruiter_discoverable accepts an explicit null (reset to \"follow visibility\"), which is why it is checked with `in` rather than truthiness.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
15143
+ "x-rank": "any-builder",
15144
+ "x-source": "modules/platform-identity/routes/profile.js",
15145
+ "requestBody": {
15146
+ "required": false,
15147
+ "content": {
15148
+ "application/json": {
15149
+ "schema": {
15150
+ "$ref": "#/components/schemas/PatchMeCrossProjectRequest"
15151
+ }
15152
+ }
15153
+ },
15154
+ "x-validated": true
15155
+ },
15156
+ "responses": {
15157
+ "200": {
15158
+ "description": "Success.",
15159
+ "content": {
15160
+ "application/json": {
15161
+ "schema": {
15162
+ "$ref": "#/components/schemas/PatchMeCrossProjectResponse"
15163
+ }
15164
+ }
15165
+ }
15166
+ },
15167
+ "400": {
15168
+ "$ref": "#/components/responses/ValidationFailed"
15169
+ },
15170
+ "401": {
15171
+ "$ref": "#/components/responses/Unauthorized"
15172
+ },
15173
+ "403": {
15174
+ "$ref": "#/components/responses/Forbidden"
15175
+ }
15176
+ },
15177
+ "security": [
15178
+ {
15179
+ "builderSession": []
15180
+ }
15181
+ ]
15182
+ }
15183
+ },
15184
+ "/me/disciplines": {
15185
+ "patch": {
15186
+ "operationId": "patch_me_disciplines",
15187
+ "tags": [
15188
+ "me"
15189
+ ],
15190
+ "summary": "PATCH /me/disciplines",
15191
+ "description": "Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). Body: { preferred_disciplines: [\"artist\", ...] }. Valid elements are whatever enabledDisciplines() offers — engineer|ideator core plus any enabled module's (artist, ui); [] clears the preference (a multi-element set just means several lanes). No rank gate — a builder owns their own profile. 422 invalid_discipline if any element is out of range. rank: any-builder — self-service profile edit; documented \"no rank gate\" in the handler comment above (a builder owns their own preference). `main_discipline` (optional, task 1004433): the builder's own MAIN role, one of the crafts in the same body; null clears it, absent keeps it (see db.updateBuilderDisciplines). 422 invalid_main_discipline otherwise.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
15192
+ "x-rank": "any-builder",
15193
+ "x-source": "src/bongos/routes/me.js",
15194
+ "requestBody": {
15195
+ "required": true,
15196
+ "content": {
15197
+ "application/json": {
15198
+ "schema": {
15199
+ "$ref": "#/components/schemas/PatchMeDisciplinesRequest"
15200
+ }
15201
+ }
15202
+ },
15203
+ "x-validated": true
15204
+ },
15205
+ "responses": {
15206
+ "200": {
15207
+ "description": "Success.",
15208
+ "content": {
15209
+ "application/json": {
15210
+ "schema": {
15211
+ "$ref": "#/components/schemas/PatchMeDisciplinesResponse"
14923
15212
  }
14924
15213
  }
14925
15214
  }
@@ -19713,14 +20002,221 @@
19713
20002
  ]
19714
20003
  }
19715
20004
  },
19716
- "/payouts/freezes": {
20005
+ "/payouts/freezes": {
20006
+ "post": {
20007
+ "operationId": "post_payouts_freezes",
20008
+ "tags": [
20009
+ "payouts"
20010
+ ],
20011
+ "summary": "POST /payouts/freezes",
20012
+ "description": "POST /api/bongos/payouts/freezes — a person freezes a builder's payouts by hand. The notice is required: there is no silent freeze. Body: { builder_id, notice_text, owed_cents? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20013
+ "x-rank": "archon",
20014
+ "x-source": "src/bongos/routes/payout-gates.js",
20015
+ "x-permissions": [
20016
+ "payout.approve"
20017
+ ],
20018
+ "requestBody": {
20019
+ "required": true,
20020
+ "content": {
20021
+ "application/json": {
20022
+ "schema": {
20023
+ "$ref": "#/components/schemas/PostPayoutsFreezesRequest"
20024
+ }
20025
+ }
20026
+ },
20027
+ "x-validated": true
20028
+ },
20029
+ "responses": {
20030
+ "200": {
20031
+ "description": "Success.",
20032
+ "content": {
20033
+ "application/json": {
20034
+ "schema": {
20035
+ "$ref": "#/components/schemas/PostPayoutsFreezesResponse"
20036
+ }
20037
+ }
20038
+ }
20039
+ },
20040
+ "400": {
20041
+ "$ref": "#/components/responses/ValidationFailed"
20042
+ },
20043
+ "401": {
20044
+ "$ref": "#/components/responses/Unauthorized"
20045
+ },
20046
+ "403": {
20047
+ "$ref": "#/components/responses/Forbidden"
20048
+ }
20049
+ },
20050
+ "security": [
20051
+ {
20052
+ "builderSession": []
20053
+ }
20054
+ ]
20055
+ }
20056
+ },
20057
+ "/payouts/freezes/{id}/decide": {
20058
+ "post": {
20059
+ "operationId": "post_payouts_freezes_id_decide",
20060
+ "tags": [
20061
+ "payouts"
20062
+ ],
20063
+ "summary": "POST /payouts/freezes/:id/decide",
20064
+ "description": "POST /api/bongos/payouts/freezes/:id/decide — uphold or lift a freeze, with the reason the person will read. Body: { decision: upheld|lifted, statement }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20065
+ "x-rank": "archon",
20066
+ "x-source": "src/bongos/routes/payout-gates.js",
20067
+ "x-permissions": [
20068
+ "payout.approve"
20069
+ ],
20070
+ "parameters": [
20071
+ {
20072
+ "name": "id",
20073
+ "in": "path",
20074
+ "required": true,
20075
+ "schema": {
20076
+ "type": "string"
20077
+ },
20078
+ "description": "Path parameter `id`."
20079
+ }
20080
+ ],
20081
+ "requestBody": {
20082
+ "required": true,
20083
+ "content": {
20084
+ "application/json": {
20085
+ "schema": {
20086
+ "$ref": "#/components/schemas/PostPayoutsFreezesIdDecideRequest"
20087
+ }
20088
+ }
20089
+ },
20090
+ "x-validated": true
20091
+ },
20092
+ "responses": {
20093
+ "200": {
20094
+ "description": "Success.",
20095
+ "content": {
20096
+ "application/json": {
20097
+ "schema": {
20098
+ "$ref": "#/components/schemas/PostPayoutsFreezesIdDecideResponse"
20099
+ }
20100
+ }
20101
+ }
20102
+ },
20103
+ "400": {
20104
+ "$ref": "#/components/responses/ValidationFailed"
20105
+ },
20106
+ "401": {
20107
+ "$ref": "#/components/responses/Unauthorized"
20108
+ },
20109
+ "403": {
20110
+ "$ref": "#/components/responses/Forbidden"
20111
+ },
20112
+ "404": {
20113
+ "$ref": "#/components/responses/NotFound"
20114
+ }
20115
+ },
20116
+ "security": [
20117
+ {
20118
+ "builderSession": []
20119
+ }
20120
+ ]
20121
+ }
20122
+ },
20123
+ "/payouts/gates/{builderId}": {
20124
+ "get": {
20125
+ "operationId": "get_payouts_gates_builderId",
20126
+ "tags": [
20127
+ "payouts"
20128
+ ],
20129
+ "summary": "GET /payouts/gates/:builderId",
20130
+ "description": "GET /api/bongos/payouts/gates/:builderId — may this builder be paid now, and why not.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20131
+ "x-rank": "archon",
20132
+ "x-source": "src/bongos/routes/payout-gates.js",
20133
+ "x-permissions": [
20134
+ "payout.approve"
20135
+ ],
20136
+ "parameters": [
20137
+ {
20138
+ "name": "builderId",
20139
+ "in": "path",
20140
+ "required": true,
20141
+ "schema": {
20142
+ "type": "string"
20143
+ },
20144
+ "description": "Path parameter `builderId`."
20145
+ }
20146
+ ],
20147
+ "responses": {
20148
+ "200": {
20149
+ "description": "Success.",
20150
+ "content": {
20151
+ "application/json": {
20152
+ "schema": {
20153
+ "$ref": "#/components/schemas/GetPayoutsGatesBuilderIdResponse"
20154
+ }
20155
+ }
20156
+ }
20157
+ },
20158
+ "400": {
20159
+ "$ref": "#/components/responses/BadRequest"
20160
+ },
20161
+ "401": {
20162
+ "$ref": "#/components/responses/Unauthorized"
20163
+ },
20164
+ "403": {
20165
+ "$ref": "#/components/responses/Forbidden"
20166
+ },
20167
+ "404": {
20168
+ "$ref": "#/components/responses/NotFound"
20169
+ }
20170
+ },
20171
+ "security": [
20172
+ {
20173
+ "builderSession": []
20174
+ }
20175
+ ]
20176
+ }
20177
+ },
20178
+ "/payouts/grants": {
20179
+ "post": {
20180
+ "operationId": "post_payouts_grants",
20181
+ "tags": [
20182
+ "payouts"
20183
+ ],
20184
+ "summary": "POST /payouts/grants",
20185
+ "description": "POST /api/bongos/payouts/grants — sign ONE equity grant. Body: { recipient_id, terms: { title, summary, document_ref? }, note? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20186
+ "x-rank": "archon",
20187
+ "x-source": "src/bongos/routes/payout-approvals.js",
20188
+ "x-permissions": [
20189
+ "payout.approve"
20190
+ ],
20191
+ "responses": {
20192
+ "200": {
20193
+ "description": "Success."
20194
+ },
20195
+ "400": {
20196
+ "$ref": "#/components/responses/BadRequest"
20197
+ },
20198
+ "401": {
20199
+ "$ref": "#/components/responses/Unauthorized"
20200
+ },
20201
+ "403": {
20202
+ "$ref": "#/components/responses/Forbidden"
20203
+ }
20204
+ },
20205
+ "security": [
20206
+ {
20207
+ "builderSession": []
20208
+ }
20209
+ ]
20210
+ }
20211
+ },
20212
+ "/payouts/guardians": {
19717
20213
  "post": {
19718
- "operationId": "post_payouts_freezes",
20214
+ "operationId": "post_payouts_guardians",
19719
20215
  "tags": [
19720
20216
  "payouts"
19721
20217
  ],
19722
- "summary": "POST /payouts/freezes",
19723
- "description": "POST /api/bongos/payouts/freezes — a person freezes a builder's payouts by hand. The notice is required: there is no silent freeze. Body: { builder_id, notice_text, owed_cents? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20218
+ "summary": "POST /payouts/guardians",
20219
+ "description": "POST /api/bongos/payouts/guardians — link (or unlink) a 16-17 builder's guardian and the account the guardian controls. Body: { builder_id, guardian_id, guardian_account?, active }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
19724
20220
  "x-rank": "archon",
19725
20221
  "x-source": "src/bongos/routes/payout-gates.js",
19726
20222
  "x-permissions": [
@@ -19731,7 +20227,7 @@
19731
20227
  "content": {
19732
20228
  "application/json": {
19733
20229
  "schema": {
19734
- "$ref": "#/components/schemas/PostPayoutsFreezesRequest"
20230
+ "$ref": "#/components/schemas/PostPayoutsGuardiansRequest"
19735
20231
  }
19736
20232
  }
19737
20233
  },
@@ -19743,7 +20239,7 @@
19743
20239
  "content": {
19744
20240
  "application/json": {
19745
20241
  "schema": {
19746
- "$ref": "#/components/schemas/PostPayoutsFreezesResponse"
20242
+ "$ref": "#/components/schemas/PostPayoutsGuardiansResponse"
19747
20243
  }
19748
20244
  }
19749
20245
  }
@@ -19765,16 +20261,140 @@
19765
20261
  ]
19766
20262
  }
19767
20263
  },
19768
- "/payouts/freezes/{id}/decide": {
20264
+ "/payouts/module-sales": {
19769
20265
  "post": {
19770
- "operationId": "post_payouts_freezes_id_decide",
20266
+ "operationId": "post_payouts_module_sales",
19771
20267
  "tags": [
19772
20268
  "payouts"
19773
20269
  ],
19774
- "summary": "POST /payouts/freezes/:id/decide",
19775
- "description": "POST /api/bongos/payouts/freezes/:id/decide — uphold or lift a freeze, with the reason the person will read. Body: { decision: upheld|lifted, statement }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20270
+ "summary": "POST /payouts/module-sales",
20271
+ "description": "POST /api/bongos/payouts/module-sales — record ONE sale the processor reports, and write every share as owed. Body: { processor_sale_ref }. The price is read from the processor, never the body. Recording the same sale again answers with the one there.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
19776
20272
  "x-rank": "archon",
19777
- "x-source": "src/bongos/routes/payout-gates.js",
20273
+ "x-source": "src/bongos/routes/module-payouts.js",
20274
+ "x-permissions": [
20275
+ "payout.approve"
20276
+ ],
20277
+ "requestBody": {
20278
+ "required": true,
20279
+ "content": {
20280
+ "application/json": {
20281
+ "schema": {
20282
+ "$ref": "#/components/schemas/PostPayoutsModuleSalesRequest"
20283
+ }
20284
+ }
20285
+ },
20286
+ "x-validated": true
20287
+ },
20288
+ "responses": {
20289
+ "200": {
20290
+ "description": "Success."
20291
+ },
20292
+ "400": {
20293
+ "$ref": "#/components/responses/ValidationFailed"
20294
+ },
20295
+ "401": {
20296
+ "$ref": "#/components/responses/Unauthorized"
20297
+ },
20298
+ "403": {
20299
+ "$ref": "#/components/responses/Forbidden"
20300
+ }
20301
+ },
20302
+ "security": [
20303
+ {
20304
+ "builderSession": []
20305
+ }
20306
+ ]
20307
+ }
20308
+ },
20309
+ "/payouts/module-shares": {
20310
+ "get": {
20311
+ "operationId": "get_payouts_module_shares",
20312
+ "tags": [
20313
+ "payouts"
20314
+ ],
20315
+ "summary": "GET /payouts/module-shares",
20316
+ "description": "GET /api/bongos/payouts/module-shares — every share and where it stands.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20317
+ "x-rank": "archon",
20318
+ "x-source": "src/bongos/routes/module-payouts.js",
20319
+ "x-permissions": [
20320
+ "payout.approve"
20321
+ ],
20322
+ "responses": {
20323
+ "200": {
20324
+ "description": "Success.",
20325
+ "content": {
20326
+ "application/json": {
20327
+ "schema": {
20328
+ "$ref": "#/components/schemas/GetPayoutsModuleSharesResponse"
20329
+ }
20330
+ }
20331
+ }
20332
+ },
20333
+ "400": {
20334
+ "$ref": "#/components/responses/BadRequest"
20335
+ },
20336
+ "401": {
20337
+ "$ref": "#/components/responses/Unauthorized"
20338
+ },
20339
+ "403": {
20340
+ "$ref": "#/components/responses/Forbidden"
20341
+ }
20342
+ },
20343
+ "security": [
20344
+ {
20345
+ "builderSession": []
20346
+ }
20347
+ ]
20348
+ }
20349
+ },
20350
+ "/payouts/module-shares/mine": {
20351
+ "get": {
20352
+ "operationId": "get_payouts_module_shares_mine",
20353
+ "tags": [
20354
+ "payouts"
20355
+ ],
20356
+ "summary": "GET /payouts/module-shares/mine",
20357
+ "description": "GET /api/bongos/payouts/module-shares/mine — the signed-in builder's own shares.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
20358
+ "x-rank": "any-builder",
20359
+ "x-source": "src/bongos/routes/module-payouts.js",
20360
+ "responses": {
20361
+ "200": {
20362
+ "description": "Success.",
20363
+ "content": {
20364
+ "application/json": {
20365
+ "schema": {
20366
+ "$ref": "#/components/schemas/GetPayoutsModuleSharesMineResponse"
20367
+ }
20368
+ }
20369
+ }
20370
+ },
20371
+ "400": {
20372
+ "$ref": "#/components/responses/BadRequest"
20373
+ },
20374
+ "401": {
20375
+ "$ref": "#/components/responses/Unauthorized"
20376
+ },
20377
+ "403": {
20378
+ "$ref": "#/components/responses/Forbidden"
20379
+ }
20380
+ },
20381
+ "security": [
20382
+ {
20383
+ "builderSession": []
20384
+ }
20385
+ ]
20386
+ }
20387
+ },
20388
+ "/payouts/module-shares/{id}/pay": {
20389
+ "post": {
20390
+ "operationId": "post_payouts_module_shares_id_pay",
20391
+ "tags": [
20392
+ "payouts"
20393
+ ],
20394
+ "summary": "POST /payouts/module-shares/:id/pay",
20395
+ "description": "POST /api/bongos/payouts/module-shares/:id/pay — send ONE share under ONE approval. Body: { approval_id }. The person and the amount come from the share; the approval must name exactly them. Pressing again is safe, as for a task payout.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20396
+ "x-rank": "archon",
20397
+ "x-source": "src/bongos/routes/module-payouts.js",
19778
20398
  "x-permissions": [
19779
20399
  "payout.approve"
19780
20400
  ],
@@ -19794,7 +20414,7 @@
19794
20414
  "content": {
19795
20415
  "application/json": {
19796
20416
  "schema": {
19797
- "$ref": "#/components/schemas/PostPayoutsFreezesIdDecideRequest"
20417
+ "$ref": "#/components/schemas/PostPayoutsModuleSharesIdPayRequest"
19798
20418
  }
19799
20419
  }
19800
20420
  },
@@ -19802,14 +20422,7 @@
19802
20422
  },
19803
20423
  "responses": {
19804
20424
  "200": {
19805
- "description": "Success.",
19806
- "content": {
19807
- "application/json": {
19808
- "schema": {
19809
- "$ref": "#/components/schemas/PostPayoutsFreezesIdDecideResponse"
19810
- }
19811
- }
19812
- }
20425
+ "description": "Success."
19813
20426
  },
19814
20427
  "400": {
19815
20428
  "$ref": "#/components/responses/ValidationFailed"
@@ -19831,40 +20444,33 @@
19831
20444
  ]
19832
20445
  }
19833
20446
  },
19834
- "/payouts/gates/{builderId}": {
20447
+ "/payouts/module-splits/{moduleKey}": {
19835
20448
  "get": {
19836
- "operationId": "get_payouts_gates_builderId",
20449
+ "operationId": "get_payouts_module_splits_moduleKey",
19837
20450
  "tags": [
19838
20451
  "payouts"
19839
20452
  ],
19840
- "summary": "GET /payouts/gates/:builderId",
19841
- "description": "GET /api/bongos/payouts/gates/:builderId — may this builder be paid now, and why not.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20453
+ "summary": "GET /payouts/module-splits/:moduleKey",
20454
+ "description": "GET /api/bongos/payouts/module-splits/:moduleKey — the module's split rule and the contributors' weights it would use now.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
19842
20455
  "x-rank": "archon",
19843
- "x-source": "src/bongos/routes/payout-gates.js",
20456
+ "x-source": "src/bongos/routes/module-payouts.js",
19844
20457
  "x-permissions": [
19845
20458
  "payout.approve"
19846
20459
  ],
19847
20460
  "parameters": [
19848
20461
  {
19849
- "name": "builderId",
20462
+ "name": "moduleKey",
19850
20463
  "in": "path",
19851
20464
  "required": true,
19852
20465
  "schema": {
19853
20466
  "type": "string"
19854
20467
  },
19855
- "description": "Path parameter `builderId`."
20468
+ "description": "Path parameter `moduleKey`."
19856
20469
  }
19857
20470
  ],
19858
20471
  "responses": {
19859
20472
  "200": {
19860
- "description": "Success.",
19861
- "content": {
19862
- "application/json": {
19863
- "schema": {
19864
- "$ref": "#/components/schemas/GetPayoutsGatesBuilderIdResponse"
19865
- }
19866
- }
19867
- }
20473
+ "description": "Success."
19868
20474
  },
19869
20475
  "400": {
19870
20476
  "$ref": "#/components/responses/BadRequest"
@@ -19884,33 +20490,63 @@
19884
20490
  "builderSession": []
19885
20491
  }
19886
20492
  ]
19887
- }
19888
- },
19889
- "/payouts/grants": {
20493
+ },
19890
20494
  "post": {
19891
- "operationId": "post_payouts_grants",
20495
+ "operationId": "post_payouts_module_splits_moduleKey",
19892
20496
  "tags": [
19893
20497
  "payouts"
19894
20498
  ],
19895
- "summary": "POST /payouts/grants",
19896
- "description": "POST /api/bongos/payouts/grants — sign ONE equity grant. Body: { recipient_id, terms: { title, summary, document_ref? }, note? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20499
+ "summary": "POST /payouts/module-splits/:moduleKey",
20500
+ "description": "POST /api/bongos/payouts/module-splits/:moduleKey — record the project's rule. Body: { seller_id, seller_bps, contributors_bps, credit_row_kinds? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
19897
20501
  "x-rank": "archon",
19898
- "x-source": "src/bongos/routes/payout-approvals.js",
20502
+ "x-source": "src/bongos/routes/module-payouts.js",
19899
20503
  "x-permissions": [
19900
20504
  "payout.approve"
19901
20505
  ],
20506
+ "parameters": [
20507
+ {
20508
+ "name": "moduleKey",
20509
+ "in": "path",
20510
+ "required": true,
20511
+ "schema": {
20512
+ "type": "string"
20513
+ },
20514
+ "description": "Path parameter `moduleKey`."
20515
+ }
20516
+ ],
20517
+ "requestBody": {
20518
+ "required": true,
20519
+ "content": {
20520
+ "application/json": {
20521
+ "schema": {
20522
+ "$ref": "#/components/schemas/PostPayoutsModuleSplitsModuleKeyRequest"
20523
+ }
20524
+ }
20525
+ },
20526
+ "x-validated": true
20527
+ },
19902
20528
  "responses": {
19903
20529
  "200": {
19904
- "description": "Success."
20530
+ "description": "Success.",
20531
+ "content": {
20532
+ "application/json": {
20533
+ "schema": {
20534
+ "$ref": "#/components/schemas/PostPayoutsModuleSplitsModuleKeyResponse"
20535
+ }
20536
+ }
20537
+ }
19905
20538
  },
19906
20539
  "400": {
19907
- "$ref": "#/components/responses/BadRequest"
20540
+ "$ref": "#/components/responses/ValidationFailed"
19908
20541
  },
19909
20542
  "401": {
19910
20543
  "$ref": "#/components/responses/Unauthorized"
19911
20544
  },
19912
20545
  "403": {
19913
20546
  "$ref": "#/components/responses/Forbidden"
20547
+ },
20548
+ "404": {
20549
+ "$ref": "#/components/responses/NotFound"
19914
20550
  }
19915
20551
  },
19916
20552
  "security": [
@@ -19920,14 +20556,14 @@
19920
20556
  ]
19921
20557
  }
19922
20558
  },
19923
- "/payouts/guardians": {
20559
+ "/payouts/ndas": {
19924
20560
  "post": {
19925
- "operationId": "post_payouts_guardians",
20561
+ "operationId": "post_payouts_ndas",
19926
20562
  "tags": [
19927
20563
  "payouts"
19928
20564
  ],
19929
- "summary": "POST /payouts/guardians",
19930
- "description": "POST /api/bongos/payouts/guardians — link (or unlink) a 16-17 builder's guardian and the account the guardian controls. Body: { builder_id, guardian_id, guardian_account?, active }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20565
+ "summary": "POST /payouts/ndas",
20566
+ "description": "POST /api/bongos/payouts/ndas — record that a builder's signed NDA is on file (or withdrawn), and where the signed copy lives. Never the NDA's text. Body: { builder_id, status: on_file|withdrawn, nda_version, reference? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
19931
20567
  "x-rank": "archon",
19932
20568
  "x-source": "src/bongos/routes/payout-gates.js",
19933
20569
  "x-permissions": [
@@ -19938,7 +20574,7 @@
19938
20574
  "content": {
19939
20575
  "application/json": {
19940
20576
  "schema": {
19941
- "$ref": "#/components/schemas/PostPayoutsGuardiansRequest"
20577
+ "$ref": "#/components/schemas/PostPayoutsNdasRequest"
19942
20578
  }
19943
20579
  }
19944
20580
  },
@@ -19950,7 +20586,7 @@
19950
20586
  "content": {
19951
20587
  "application/json": {
19952
20588
  "schema": {
19953
- "$ref": "#/components/schemas/PostPayoutsGuardiansResponse"
20589
+ "$ref": "#/components/schemas/PostPayoutsNdasResponse"
19954
20590
  }
19955
20591
  }
19956
20592
  }
@@ -20261,45 +20897,100 @@
20261
20897
  ]
20262
20898
  }
20263
20899
  },
20264
- "/payouts/rules/{id}/runs/{runKey}/hold": {
20900
+ "/payouts/rules/{id}/runs/{runKey}/hold": {
20901
+ "post": {
20902
+ "operationId": "post_payouts_rules_id_runs_runKey_hold",
20903
+ "tags": [
20904
+ "payouts"
20905
+ ],
20906
+ "summary": "POST /payouts/rules/:id/runs/:runKey/hold",
20907
+ "description": "POST /api/bongos/payouts/rules/:id/runs/:runKey/hold — a person stops a run in its pause window. Body: { note? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20908
+ "x-rank": "archon",
20909
+ "x-source": "src/bongos/routes/payout-approvals.js",
20910
+ "x-permissions": [
20911
+ "payout.approve"
20912
+ ],
20913
+ "parameters": [
20914
+ {
20915
+ "name": "id",
20916
+ "in": "path",
20917
+ "required": true,
20918
+ "schema": {
20919
+ "type": "string"
20920
+ },
20921
+ "description": "Path parameter `id`."
20922
+ },
20923
+ {
20924
+ "name": "runKey",
20925
+ "in": "path",
20926
+ "required": true,
20927
+ "schema": {
20928
+ "type": "string"
20929
+ },
20930
+ "description": "Path parameter `runKey`."
20931
+ }
20932
+ ],
20933
+ "requestBody": {
20934
+ "required": false,
20935
+ "content": {
20936
+ "application/json": {
20937
+ "schema": {
20938
+ "$ref": "#/components/schemas/PostPayoutsRulesIdRunsRunKeyHoldRequest"
20939
+ }
20940
+ }
20941
+ },
20942
+ "x-validated": true
20943
+ },
20944
+ "responses": {
20945
+ "200": {
20946
+ "description": "Success.",
20947
+ "content": {
20948
+ "application/json": {
20949
+ "schema": {
20950
+ "$ref": "#/components/schemas/PostPayoutsRulesIdRunsRunKeyHoldResponse"
20951
+ }
20952
+ }
20953
+ }
20954
+ },
20955
+ "400": {
20956
+ "$ref": "#/components/responses/ValidationFailed"
20957
+ },
20958
+ "401": {
20959
+ "$ref": "#/components/responses/Unauthorized"
20960
+ },
20961
+ "403": {
20962
+ "$ref": "#/components/responses/Forbidden"
20963
+ },
20964
+ "404": {
20965
+ "$ref": "#/components/responses/NotFound"
20966
+ }
20967
+ },
20968
+ "security": [
20969
+ {
20970
+ "builderSession": []
20971
+ }
20972
+ ]
20973
+ }
20974
+ },
20975
+ "/payouts/screenings": {
20265
20976
  "post": {
20266
- "operationId": "post_payouts_rules_id_runs_runKey_hold",
20977
+ "operationId": "post_payouts_screenings",
20267
20978
  "tags": [
20268
20979
  "payouts"
20269
20980
  ],
20270
- "summary": "POST /payouts/rules/:id/runs/:runKey/hold",
20271
- "description": "POST /api/bongos/payouts/rules/:id/runs/:runKey/hold — a person stops a run in its pause window. Body: { note? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20981
+ "summary": "POST /payouts/screenings",
20982
+ "description": "POST /api/bongos/payouts/screenings — record a sanctions screening a person ran. Body: { builder_id, result: clear|match|error, reference?, valid_days? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20272
20983
  "x-rank": "archon",
20273
- "x-source": "src/bongos/routes/payout-approvals.js",
20984
+ "x-source": "src/bongos/routes/payout-gates.js",
20274
20985
  "x-permissions": [
20275
20986
  "payout.approve"
20276
20987
  ],
20277
- "parameters": [
20278
- {
20279
- "name": "id",
20280
- "in": "path",
20281
- "required": true,
20282
- "schema": {
20283
- "type": "string"
20284
- },
20285
- "description": "Path parameter `id`."
20286
- },
20287
- {
20288
- "name": "runKey",
20289
- "in": "path",
20290
- "required": true,
20291
- "schema": {
20292
- "type": "string"
20293
- },
20294
- "description": "Path parameter `runKey`."
20295
- }
20296
- ],
20297
20988
  "requestBody": {
20298
- "required": false,
20989
+ "required": true,
20299
20990
  "content": {
20300
20991
  "application/json": {
20301
20992
  "schema": {
20302
- "$ref": "#/components/schemas/PostPayoutsRulesIdRunsRunKeyHoldRequest"
20993
+ "$ref": "#/components/schemas/PostPayoutsScreeningsRequest"
20303
20994
  }
20304
20995
  }
20305
20996
  },
@@ -20311,7 +21002,7 @@
20311
21002
  "content": {
20312
21003
  "application/json": {
20313
21004
  "schema": {
20314
- "$ref": "#/components/schemas/PostPayoutsRulesIdRunsRunKeyHoldResponse"
21005
+ "$ref": "#/components/schemas/PostPayoutsScreeningsResponse"
20315
21006
  }
20316
21007
  }
20317
21008
  }
@@ -20324,9 +21015,6 @@
20324
21015
  },
20325
21016
  "403": {
20326
21017
  "$ref": "#/components/responses/Forbidden"
20327
- },
20328
- "404": {
20329
- "$ref": "#/components/responses/NotFound"
20330
21018
  }
20331
21019
  },
20332
21020
  "security": [
@@ -20336,14 +21024,14 @@
20336
21024
  ]
20337
21025
  }
20338
21026
  },
20339
- "/payouts/screenings": {
21027
+ "/payouts/tax-details": {
20340
21028
  "post": {
20341
- "operationId": "post_payouts_screenings",
21029
+ "operationId": "post_payouts_tax_details",
20342
21030
  "tags": [
20343
21031
  "payouts"
20344
21032
  ],
20345
- "summary": "POST /payouts/screenings",
20346
- "description": "POST /api/bongos/payouts/screenings — record a sanctions screening a person ran. Body: { builder_id, result: clear|match|error, reference?, valid_days? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
21033
+ "summary": "POST /payouts/tax-details",
21034
+ "description": "POST /api/bongos/payouts/tax-details — record that the processor's onboarding has (or has not) collected a builder's identity and tax details, as checked by a person. The tax id itself never comes here: a reference that looks like one is refused. Body: { builder_id, status: collected|incomplete, reference? }.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
20347
21035
  "x-rank": "archon",
20348
21036
  "x-source": "src/bongos/routes/payout-gates.js",
20349
21037
  "x-permissions": [
@@ -20354,7 +21042,7 @@
20354
21042
  "content": {
20355
21043
  "application/json": {
20356
21044
  "schema": {
20357
- "$ref": "#/components/schemas/PostPayoutsScreeningsRequest"
21045
+ "$ref": "#/components/schemas/PostPayoutsTaxDetailsRequest"
20358
21046
  }
20359
21047
  }
20360
21048
  },
@@ -20366,7 +21054,7 @@
20366
21054
  "content": {
20367
21055
  "application/json": {
20368
21056
  "schema": {
20369
- "$ref": "#/components/schemas/PostPayoutsScreeningsResponse"
21057
+ "$ref": "#/components/schemas/PostPayoutsTaxDetailsResponse"
20370
21058
  }
20371
21059
  }
20372
21060
  }
@@ -20464,6 +21152,74 @@
20464
21152
  ]
20465
21153
  }
20466
21154
  },
21155
+ "/project-account/ledger-checks": {
21156
+ "get": {
21157
+ "operationId": "get_project_account_ledger_checks",
21158
+ "tags": [
21159
+ "project-account"
21160
+ ],
21161
+ "summary": "GET /project-account/ledger-checks",
21162
+ "description": "GET /project-account/ledger-checks?limit=10 — the daily check of our record against the processor's (task 1004912, ADR 0397 D7): each check's outcome and, on a difference, the amounts and processor references. Same gate as the account; the alarm it raises is a public blocker with no numbers in it, so the numbers are read here.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
21163
+ "x-rank": "archon",
21164
+ "x-source": "modules/economy/routes/project-account.js",
21165
+ "x-permissions": [
21166
+ "payout.approve"
21167
+ ],
21168
+ "responses": {
21169
+ "200": {
21170
+ "description": "Success."
21171
+ },
21172
+ "400": {
21173
+ "$ref": "#/components/responses/BadRequest"
21174
+ },
21175
+ "401": {
21176
+ "$ref": "#/components/responses/Unauthorized"
21177
+ },
21178
+ "403": {
21179
+ "$ref": "#/components/responses/Forbidden"
21180
+ }
21181
+ },
21182
+ "security": [
21183
+ {
21184
+ "builderSession": []
21185
+ }
21186
+ ]
21187
+ }
21188
+ },
21189
+ "/project-account/outflow": {
21190
+ "get": {
21191
+ "operationId": "get_project_account_outflow",
21192
+ "tags": [
21193
+ "project-account"
21194
+ ],
21195
+ "summary": "GET /project-account/outflow",
21196
+ "description": "GET /project-account/outflow?months=12 — where the money went (task 1003184, criterion money-outflow-visible): spend and money out per month, per-builder totals, and what is committed but not yet paid beside the balance left after it. Same gate as the account: who was paid what is the project's own money. Read only, summed from existing records.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `payout.approve` (all required).",
21197
+ "x-rank": "archon",
21198
+ "x-source": "modules/economy/routes/project-account.js",
21199
+ "x-permissions": [
21200
+ "payout.approve"
21201
+ ],
21202
+ "responses": {
21203
+ "200": {
21204
+ "description": "Success."
21205
+ },
21206
+ "400": {
21207
+ "$ref": "#/components/responses/BadRequest"
21208
+ },
21209
+ "401": {
21210
+ "$ref": "#/components/responses/Unauthorized"
21211
+ },
21212
+ "403": {
21213
+ "$ref": "#/components/responses/Forbidden"
21214
+ }
21215
+ },
21216
+ "security": [
21217
+ {
21218
+ "builderSession": []
21219
+ }
21220
+ ]
21221
+ }
21222
+ },
20467
21223
  "/project-settings": {
20468
21224
  "get": {
20469
21225
  "operationId": "get_project_settings",
@@ -20505,6 +21261,80 @@
20505
21261
  ]
20506
21262
  }
20507
21263
  },
21264
+ "/project-settings/funding-wall": {
21265
+ "get": {
21266
+ "operationId": "get_project_settings_funding_wall",
21267
+ "tags": [
21268
+ "project-settings"
21269
+ ],
21270
+ "summary": "GET /project-settings/funding-wall",
21271
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
21272
+ "x-rank": "any-builder",
21273
+ "x-source": "modules/lifecycle/routes/project-settings.js",
21274
+ "responses": {
21275
+ "200": {
21276
+ "description": "Success."
21277
+ },
21278
+ "400": {
21279
+ "$ref": "#/components/responses/BadRequest"
21280
+ },
21281
+ "401": {
21282
+ "$ref": "#/components/responses/Unauthorized"
21283
+ },
21284
+ "403": {
21285
+ "$ref": "#/components/responses/Forbidden"
21286
+ }
21287
+ },
21288
+ "security": [
21289
+ {
21290
+ "builderSession": []
21291
+ }
21292
+ ]
21293
+ },
21294
+ "patch": {
21295
+ "operationId": "patch_project_settings_funding_wall",
21296
+ "tags": [
21297
+ "project-settings"
21298
+ ],
21299
+ "summary": "PATCH /project-settings/funding-wall",
21300
+ "description": "PATCH /project-settings/funding-wall — body { mode: 'hold_at_claim' | 'refuse_at_completion' | 'carry_on' }. rank: project.settings.manage (metic+, government_010), the same atom as the pay-terms write: the funding rule is part of the project's pay policy (ADR 0385 amendment), so every change also lands in the audit log (who, when, from what to what).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
21301
+ "x-rank": "metic+archon",
21302
+ "x-source": "modules/lifecycle/routes/project-settings.js",
21303
+ "x-permissions": [
21304
+ "project.settings.manage"
21305
+ ],
21306
+ "requestBody": {
21307
+ "required": true,
21308
+ "content": {
21309
+ "application/json": {
21310
+ "schema": {
21311
+ "$ref": "#/components/schemas/PatchProjectSettingsFundingWallRequest"
21312
+ }
21313
+ }
21314
+ },
21315
+ "x-validated": true
21316
+ },
21317
+ "responses": {
21318
+ "200": {
21319
+ "description": "Success."
21320
+ },
21321
+ "400": {
21322
+ "$ref": "#/components/responses/ValidationFailed"
21323
+ },
21324
+ "401": {
21325
+ "$ref": "#/components/responses/Unauthorized"
21326
+ },
21327
+ "403": {
21328
+ "$ref": "#/components/responses/Forbidden"
21329
+ }
21330
+ },
21331
+ "security": [
21332
+ {
21333
+ "builderSession": []
21334
+ }
21335
+ ]
21336
+ }
21337
+ },
20508
21338
  "/project-settings/pay-terms": {
20509
21339
  "patch": {
20510
21340
  "operationId": "patch_project_settings_pay_terms",
@@ -32629,10 +33459,12 @@
32629
33459
  "GetPayTermsResponse": {
32630
33460
  "type": "object",
32631
33461
  "properties": {
32632
- "pay_terms": {}
33462
+ "pay_terms": {},
33463
+ "funding_wall": {}
32633
33464
  },
32634
33465
  "required": [
32635
- "pay_terms"
33466
+ "pay_terms",
33467
+ "funding_wall"
32636
33468
  ]
32637
33469
  },
32638
33470
  "GetPayTypeGatesResponse": {
@@ -32675,6 +33507,24 @@
32675
33507
  "gate"
32676
33508
  ]
32677
33509
  },
33510
+ "GetPayoutsModuleSharesMineResponse": {
33511
+ "type": "object",
33512
+ "properties": {
33513
+ "shares": {}
33514
+ },
33515
+ "required": [
33516
+ "shares"
33517
+ ]
33518
+ },
33519
+ "GetPayoutsModuleSharesResponse": {
33520
+ "type": "object",
33521
+ "properties": {
33522
+ "shares": {}
33523
+ },
33524
+ "required": [
33525
+ "shares"
33526
+ ]
33527
+ },
32678
33528
  "GetPayoutsRulesResponse": {
32679
33529
  "type": "object",
32680
33530
  "properties": {
@@ -34280,6 +35130,18 @@
34280
35130
  "updated_at"
34281
35131
  ]
34282
35132
  },
35133
+ "PatchProjectSettingsFundingWallRequest": {
35134
+ "type": "object",
35135
+ "properties": {
35136
+ "mode": {
35137
+ "type": "string"
35138
+ }
35139
+ },
35140
+ "required": [
35141
+ "mode"
35142
+ ],
35143
+ "additionalProperties": false
35144
+ },
34283
35145
  "PatchProjectSettingsPayTermsRequest": {
34284
35146
  "type": "object",
34285
35147
  "properties": {
@@ -37946,6 +38808,20 @@
37946
38808
  "linked"
37947
38809
  ]
37948
38810
  },
38811
+ "PostMeCashOutsRequest": {
38812
+ "type": "object",
38813
+ "properties": {
38814
+ "amount_cents": {},
38815
+ "instruction_id": {
38816
+ "$ref": "#/components/schemas/StringifiableId"
38817
+ }
38818
+ },
38819
+ "required": [
38820
+ "amount_cents",
38821
+ "instruction_id"
38822
+ ],
38823
+ "additionalProperties": false
38824
+ },
37949
38825
  "PostMeFilterViewsRequest": {
37950
38826
  "type": "object",
37951
38827
  "properties": {
@@ -38758,6 +39634,80 @@
38758
39634
  "record"
38759
39635
  ]
38760
39636
  },
39637
+ "PostPayoutsModuleSalesRequest": {
39638
+ "type": "object",
39639
+ "properties": {
39640
+ "processor_sale_ref": {}
39641
+ },
39642
+ "required": [
39643
+ "processor_sale_ref"
39644
+ ],
39645
+ "additionalProperties": false
39646
+ },
39647
+ "PostPayoutsModuleSharesIdPayRequest": {
39648
+ "type": "object",
39649
+ "properties": {
39650
+ "approval_id": {
39651
+ "$ref": "#/components/schemas/StringifiableId"
39652
+ }
39653
+ },
39654
+ "required": [
39655
+ "approval_id"
39656
+ ],
39657
+ "additionalProperties": false
39658
+ },
39659
+ "PostPayoutsModuleSplitsModuleKeyRequest": {
39660
+ "type": "object",
39661
+ "properties": {
39662
+ "seller_id": {
39663
+ "$ref": "#/components/schemas/StringifiableId"
39664
+ },
39665
+ "seller_bps": {},
39666
+ "contributors_bps": {},
39667
+ "credit_row_kinds": {}
39668
+ },
39669
+ "required": [
39670
+ "seller_id",
39671
+ "seller_bps",
39672
+ "contributors_bps"
39673
+ ],
39674
+ "additionalProperties": false
39675
+ },
39676
+ "PostPayoutsModuleSplitsModuleKeyResponse": {
39677
+ "type": "object",
39678
+ "properties": {
39679
+ "rule": {}
39680
+ },
39681
+ "required": [
39682
+ "rule"
39683
+ ]
39684
+ },
39685
+ "PostPayoutsNdasRequest": {
39686
+ "type": "object",
39687
+ "properties": {
39688
+ "builder_id": {
39689
+ "$ref": "#/components/schemas/StringifiableId"
39690
+ },
39691
+ "status": {},
39692
+ "nda_version": {},
39693
+ "reference": {}
39694
+ },
39695
+ "required": [
39696
+ "builder_id",
39697
+ "status",
39698
+ "nda_version"
39699
+ ],
39700
+ "additionalProperties": false
39701
+ },
39702
+ "PostPayoutsNdasResponse": {
39703
+ "type": "object",
39704
+ "properties": {
39705
+ "record": {}
39706
+ },
39707
+ "required": [
39708
+ "record"
39709
+ ]
39710
+ },
38761
39711
  "PostPayoutsRulesIdNarrowRequest": {
38762
39712
  "type": "object",
38763
39713
  "properties": {
@@ -38875,6 +39825,30 @@
38875
39825
  "record"
38876
39826
  ]
38877
39827
  },
39828
+ "PostPayoutsTaxDetailsRequest": {
39829
+ "type": "object",
39830
+ "properties": {
39831
+ "builder_id": {
39832
+ "$ref": "#/components/schemas/StringifiableId"
39833
+ },
39834
+ "status": {},
39835
+ "reference": {}
39836
+ },
39837
+ "required": [
39838
+ "builder_id",
39839
+ "status"
39840
+ ],
39841
+ "additionalProperties": false
39842
+ },
39843
+ "PostPayoutsTaxDetailsResponse": {
39844
+ "type": "object",
39845
+ "properties": {
39846
+ "record": {}
39847
+ },
39848
+ "required": [
39849
+ "record"
39850
+ ]
39851
+ },
38878
39852
  "PostProjectsInviteGuildRequest": {
38879
39853
  "type": "object",
38880
39854
  "properties": {
@@ -41760,9 +42734,9 @@
41760
42734
  "description": "A required dependency/feature is not configured or is temporarily down."
41761
42735
  }
41762
42736
  },
41763
- "x-endpoint-count": 659,
41764
- "x-schema-count": 707,
42737
+ "x-endpoint-count": 679,
42738
+ "x-schema-count": 719,
41765
42739
  "x-undocumented-bodies": 12,
41766
- "x-response-schemas": 452,
42740
+ "x-response-schemas": 457,
41767
42741
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
41768
42742
  }