@wildo-ai/saas-technical-doc 1.1.4 → 1.1.6

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 (205) hide show
  1. package/dist/esm/build/csp-emit.d.ts.map +1 -1
  2. package/dist/esm/build/load-materialized-frontend-providers.d.ts.map +1 -1
  3. package/dist/esm/companion/application-documentation/application-administration-documentation.d.ts.map +1 -1
  4. package/dist/esm/companion/application-documentation/application-administration-documentation.js.map +1 -1
  5. package/dist/esm/companion/application-documentation/application-authentication-documentation.d.ts.map +1 -1
  6. package/dist/esm/companion/application-documentation/application-connection-documentation.d.ts +37 -0
  7. package/dist/esm/companion/application-documentation/application-connection-documentation.d.ts.map +1 -1
  8. package/dist/esm/companion/application-documentation/application-connection-documentation.js +46 -5
  9. package/dist/esm/companion/application-documentation/application-connection-documentation.js.map +1 -1
  10. package/dist/esm/companion/application-documentation/application-documentation-chapters.d.ts +101 -0
  11. package/dist/esm/companion/application-documentation/application-documentation-chapters.d.ts.map +1 -0
  12. package/dist/esm/companion/application-documentation/application-documentation-chapters.js +205 -0
  13. package/dist/esm/companion/application-documentation/application-documentation-chapters.js.map +1 -0
  14. package/dist/esm/companion/application-documentation/application-domain-documentation.d.ts.map +1 -1
  15. package/dist/esm/companion/application-documentation/application-domain-documentation.js.map +1 -1
  16. package/dist/esm/companion/application-documentation/application-integration-documentation.d.ts.map +1 -1
  17. package/dist/esm/companion/application-documentation/application-integration-documentation.js.map +1 -1
  18. package/dist/esm/companion/application-documentation/application-organization-role-documentation.d.ts.map +1 -1
  19. package/dist/esm/companion/application-documentation/application-organization-role-documentation.js.map +1 -1
  20. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.d.ts.map +1 -1
  21. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.js +3 -0
  22. package/dist/esm/companion/application-documentation/application-organization-unit-resource-documentation.js.map +1 -1
  23. package/dist/esm/companion/application-documentation/docs-api-origin-substitution.d.ts +34 -0
  24. package/dist/esm/companion/application-documentation/docs-api-origin-substitution.d.ts.map +1 -0
  25. package/dist/esm/companion/application-documentation/docs-api-origin-substitution.js +45 -0
  26. package/dist/esm/companion/application-documentation/docs-api-origin-substitution.js.map +1 -0
  27. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts +24 -10
  28. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.d.ts.map +1 -1
  29. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js +25 -15
  30. package/dist/esm/companion/application-documentation/technical-documentation-engine-content-bundle.js.map +1 -1
  31. package/dist/esm/companion/application-documentation/technical-documentation-operational-evidence.d.ts.map +1 -1
  32. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts +11 -3
  33. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.d.ts.map +1 -1
  34. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js +9 -2
  35. package/dist/esm/companion/application-documentation/technical-documentation-private-derivation.js.map +1 -1
  36. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.d.ts.map +1 -1
  37. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js +10 -4
  38. package/dist/esm/companion/application-documentation/technical-documentation-publication-policy.js.map +1 -1
  39. package/dist/esm/companion/content/application-consumer-documentation-content-loader.d.ts.map +1 -1
  40. package/dist/esm/companion/index.d.ts +2 -0
  41. package/dist/esm/companion/index.d.ts.map +1 -1
  42. package/dist/esm/companion/index.js +2 -0
  43. package/dist/esm/companion/index.js.map +1 -1
  44. package/dist/esm/companion/manual-controller-route-projection.d.ts.map +1 -1
  45. package/dist/esm/companion/manual-controller-route-projection.js.map +1 -1
  46. package/dist/esm/companion/openapi-example-derivation.d.ts +53 -0
  47. package/dist/esm/companion/openapi-example-derivation.d.ts.map +1 -0
  48. package/dist/esm/companion/openapi-example-derivation.js +229 -0
  49. package/dist/esm/companion/openapi-example-derivation.js.map +1 -0
  50. package/dist/esm/companion/openapi-generator.d.ts +8 -4
  51. package/dist/esm/companion/openapi-generator.d.ts.map +1 -1
  52. package/dist/esm/companion/openapi-generator.js +323 -33
  53. package/dist/esm/companion/openapi-generator.js.map +1 -1
  54. package/dist/esm/companion/operation-projection.schemas.d.ts +57 -1
  55. package/dist/esm/companion/operation-projection.schemas.d.ts.map +1 -1
  56. package/dist/esm/companion/operation-projection.schemas.js +29 -0
  57. package/dist/esm/companion/operation-projection.schemas.js.map +1 -1
  58. package/dist/esm/companion/publish-result.types.d.ts.map +1 -1
  59. package/dist/esm/companion/publish-result.types.js.map +1 -1
  60. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.d.ts.map +1 -1
  61. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts.map +1 -1
  62. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js +8 -0
  63. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js.map +1 -1
  64. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.d.ts.map +1 -1
  65. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js +20 -0
  66. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js.map +1 -1
  67. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.d.ts +2 -0
  68. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.d.ts.map +1 -1
  69. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.js +48 -31
  70. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.js.map +1 -1
  71. package/dist/esm/companion/rendering/technical-documentation-render-model.d.ts.map +1 -1
  72. package/dist/esm/companion/rendering/technical-documentation-render-model.js +26 -10
  73. package/dist/esm/companion/rendering/technical-documentation-render-model.js.map +1 -1
  74. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts.map +1 -1
  75. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js.map +1 -1
  76. package/dist/esm/companion/spec-to-operation-doc.d.ts +52 -10
  77. package/dist/esm/companion/spec-to-operation-doc.d.ts.map +1 -1
  78. package/dist/esm/companion/spec-to-operation-doc.js +125 -7
  79. package/dist/esm/companion/spec-to-operation-doc.js.map +1 -1
  80. package/dist/esm/companion/technical-documentation-asset-path.d.ts.map +1 -1
  81. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts.map +1 -1
  82. package/dist/esm/companion/technical-documentation-capture-execution-port.js.map +1 -1
  83. package/dist/esm/companion/technical-documentation-diagram-definitions.d.ts.map +1 -1
  84. package/dist/esm/companion/technical-documentation-diagram-definitions.js.map +1 -1
  85. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts.map +1 -1
  86. package/dist/esm/companion/technical-documentation-diagram-materializer.js.map +1 -1
  87. package/dist/esm/companion/technical-documentation-placeholder-materializer.d.ts.map +1 -1
  88. package/dist/esm/companion/zod-to-openapi.d.ts.map +1 -1
  89. package/dist/esm/companion-exports.d.ts.map +1 -1
  90. package/dist/esm/config/define-tech-doc-config.d.ts.map +1 -1
  91. package/dist/esm/config/index.d.ts.map +1 -1
  92. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts.map +1 -1
  93. package/dist/esm/config/wildo-tech-doc-config.schemas.js.map +1 -1
  94. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.d.ts.map +1 -1
  95. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts +27 -24
  96. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts.map +1 -1
  97. package/dist/esm/content/application-consumer-documentation-content.techdoc.js +205 -82
  98. package/dist/esm/content/application-consumer-documentation-content.techdoc.js.map +1 -1
  99. package/dist/esm/content.exports.d.ts.map +1 -1
  100. package/dist/esm/index.d.ts.map +1 -1
  101. package/dist/esm/openapi/api-reference-link-index.d.ts +3 -0
  102. package/dist/esm/openapi/api-reference-link-index.d.ts.map +1 -1
  103. package/dist/esm/openapi/api-reference-link-index.js +26 -15
  104. package/dist/esm/openapi/api-reference-link-index.js.map +1 -1
  105. package/dist/esm/openapi/api-reference-pages.d.ts +55 -0
  106. package/dist/esm/openapi/api-reference-pages.d.ts.map +1 -0
  107. package/dist/esm/openapi/api-reference-pages.js +229 -0
  108. package/dist/esm/openapi/api-reference-pages.js.map +1 -0
  109. package/dist/esm/openapi/api-reference-search.d.ts +53 -0
  110. package/dist/esm/openapi/api-reference-search.d.ts.map +1 -0
  111. package/dist/esm/openapi/api-reference-search.js +100 -0
  112. package/dist/esm/openapi/api-reference-search.js.map +1 -0
  113. package/dist/esm/openapi/api-reference-targets.d.ts +11 -0
  114. package/dist/esm/openapi/api-reference-targets.d.ts.map +1 -1
  115. package/dist/esm/openapi/api-reference-targets.js +8 -0
  116. package/dist/esm/openapi/api-reference-targets.js.map +1 -1
  117. package/dist/esm/openapi/index.d.ts +2 -0
  118. package/dist/esm/openapi/index.d.ts.map +1 -1
  119. package/dist/esm/openapi/index.js +2 -0
  120. package/dist/esm/openapi/index.js.map +1 -1
  121. package/dist/esm/openapi/openapi-generation-output.schemas.d.ts.map +1 -1
  122. package/dist/esm/openapi-reference-model.exports.d.ts +2 -0
  123. package/dist/esm/openapi-reference-model.exports.d.ts.map +1 -1
  124. package/dist/esm/openapi-reference-model.exports.js +2 -0
  125. package/dist/esm/openapi-reference-model.exports.js.map +1 -1
  126. package/dist/esm/runtime/AuthExchangePage.d.ts +45 -4
  127. package/dist/esm/runtime/AuthExchangePage.d.ts.map +1 -1
  128. package/dist/esm/runtime/AuthExchangePage.js +45 -12
  129. package/dist/esm/runtime/AuthExchangePage.js.map +1 -1
  130. package/dist/esm/runtime/DocsAuthContext.d.ts +2 -2
  131. package/dist/esm/runtime/DocsAuthContext.d.ts.map +1 -1
  132. package/dist/esm/runtime/DocsAuthContext.js +8 -4
  133. package/dist/esm/runtime/DocsAuthContext.js.map +1 -1
  134. package/dist/esm/runtime/DocsFrontendProviders.d.ts +30 -0
  135. package/dist/esm/runtime/DocsFrontendProviders.d.ts.map +1 -0
  136. package/dist/esm/runtime/DocsFrontendProviders.js +39 -0
  137. package/dist/esm/runtime/DocsFrontendProviders.js.map +1 -0
  138. package/dist/esm/runtime/DocsProviderComponent.d.ts +41 -0
  139. package/dist/esm/runtime/DocsProviderComponent.d.ts.map +1 -0
  140. package/dist/esm/runtime/DocsProviderComponent.js +17 -0
  141. package/dist/esm/runtime/DocsProviderComponent.js.map +1 -0
  142. package/dist/esm/runtime/decode-jwt-claims.d.ts.map +1 -1
  143. package/dist/esm/runtime/docs-auth-client.d.ts.map +1 -1
  144. package/dist/esm/runtime/docs-auth-session.schemas.d.ts.map +1 -1
  145. package/dist/esm/runtime/documentation-site-translator.d.ts +53 -0
  146. package/dist/esm/runtime/documentation-site-translator.d.ts.map +1 -0
  147. package/dist/esm/runtime/documentation-site-translator.js +51 -0
  148. package/dist/esm/runtime/documentation-site-translator.js.map +1 -0
  149. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts +1 -2
  150. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts.map +1 -1
  151. package/dist/esm/runtime/frontend-provider-registry.techdoc.js.map +1 -1
  152. package/dist/esm/runtime/index.d.ts +8 -0
  153. package/dist/esm/runtime/index.d.ts.map +1 -1
  154. package/dist/esm/runtime/index.js +8 -0
  155. package/dist/esm/runtime/index.js.map +1 -1
  156. package/dist/esm/runtime/openapi-reference-conservation.d.ts.map +1 -1
  157. package/dist/esm/runtime/openapi-reference-model.d.ts +30 -0
  158. package/dist/esm/runtime/openapi-reference-model.d.ts.map +1 -1
  159. package/dist/esm/runtime/openapi-reference-model.js +85 -11
  160. package/dist/esm/runtime/openapi-reference-model.js.map +1 -1
  161. package/dist/esm/runtime/openapi-reference-navigation.d.ts +50 -0
  162. package/dist/esm/runtime/openapi-reference-navigation.d.ts.map +1 -0
  163. package/dist/esm/runtime/openapi-reference-navigation.js +46 -0
  164. package/dist/esm/runtime/openapi-reference-navigation.js.map +1 -0
  165. package/dist/esm/runtime/openapi-reference-samples.d.ts +40 -0
  166. package/dist/esm/runtime/openapi-reference-samples.d.ts.map +1 -0
  167. package/dist/esm/runtime/openapi-reference-samples.js +169 -0
  168. package/dist/esm/runtime/openapi-reference-samples.js.map +1 -0
  169. package/dist/esm/runtime/openapi-reference-styles.d.ts +28 -0
  170. package/dist/esm/runtime/openapi-reference-styles.d.ts.map +1 -0
  171. package/dist/esm/runtime/openapi-reference-styles.js +292 -0
  172. package/dist/esm/runtime/openapi-reference-styles.js.map +1 -0
  173. package/dist/esm/runtime/openapi-reference-view.d.ts +40 -5
  174. package/dist/esm/runtime/openapi-reference-view.d.ts.map +1 -1
  175. package/dist/esm/runtime/openapi-reference-view.js +828 -82
  176. package/dist/esm/runtime/openapi-reference-view.js.map +1 -1
  177. package/dist/esm/runtime/openapi-reference-words-context.d.ts +12 -0
  178. package/dist/esm/runtime/openapi-reference-words-context.d.ts.map +1 -0
  179. package/dist/esm/runtime/openapi-reference-words-context.js +30 -0
  180. package/dist/esm/runtime/openapi-reference-words-context.js.map +1 -0
  181. package/dist/esm/runtime/openapi-reference-words.d.ts +205 -0
  182. package/dist/esm/runtime/openapi-reference-words.d.ts.map +1 -0
  183. package/dist/esm/runtime/openapi-reference-words.js +162 -0
  184. package/dist/esm/runtime/openapi-reference-words.js.map +1 -0
  185. package/dist/esm/runtime/provider-component-registry.techdoc.d.ts +31 -0
  186. package/dist/esm/runtime/provider-component-registry.techdoc.d.ts.map +1 -0
  187. package/dist/esm/runtime/provider-component-registry.techdoc.js +35 -0
  188. package/dist/esm/runtime/provider-component-registry.techdoc.js.map +1 -0
  189. package/dist/esm/runtime/use-docs-auth-session.d.ts.map +1 -1
  190. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts +1 -0
  191. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts.map +1 -1
  192. package/dist/esm/runtime/use-docs-frontend-provider-registry.js +10 -2
  193. package/dist/esm/runtime/use-docs-frontend-provider-registry.js.map +1 -1
  194. package/dist/esm/runtime/use-docs-provider-component.d.ts +29 -0
  195. package/dist/esm/runtime/use-docs-provider-component.d.ts.map +1 -0
  196. package/dist/esm/runtime/use-docs-provider-component.js +42 -0
  197. package/dist/esm/runtime/use-docs-provider-component.js.map +1 -0
  198. package/dist/esm/runtime/use-docs-provider-scripts.d.ts +37 -0
  199. package/dist/esm/runtime/use-docs-provider-scripts.d.ts.map +1 -0
  200. package/dist/esm/runtime/use-docs-provider-scripts.js +47 -0
  201. package/dist/esm/runtime/use-docs-provider-scripts.js.map +1 -0
  202. package/dist/esm/runtime/use-docs-provider-sdks.d.ts.map +1 -1
  203. package/dist/esm/runtime/use-docs-provider-sdks.js.map +1 -1
  204. package/dist/tsconfig.build.tsbuildinfo +1 -1
  205. package/package.json +8 -24
@@ -1 +1 @@
1
- {"version":3,"file":"application-consumer-documentation-content.techdoc.d.ts","sourceRoot":"","sources":["../../../src/content/application-consumer-documentation-content.techdoc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,sDAAsD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4qQzD,CAAC"}
1
+ {"version":3,"file":"application-consumer-documentation-content.techdoc.d.ts","sourceRoot":"","sources":["../../../../src/content/application-consumer-documentation-content.techdoc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,sDAAsD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoyQzD,CAAC"}
@@ -20,9 +20,12 @@
20
20
  * fact in it is projected from sources the application already accepted — its own resource
21
21
  * registry, its declared API-reference categories, and each specification's purpose and lifecycle.
22
22
  *
23
- * What remains genuinely deferred is a page PER resource. Those need a variable unit set, and the
24
- * renderer's route table is deliberately fixed (see `pathForUnit`), so an application-owned unit
25
- * still fails closed rather than acquiring an implicit route.
23
+ * A page PER resource followed, as a generated tier with its own reserved namespace (see
24
+ * `pathForUnit`). And a cross-resource BUSINESS use case — the journey this module can never write,
25
+ * because it belongs to one application — is authored by that application as a documentation
26
+ * chapter its plan declares (#874, `application-documentation-chapters.ts`), again in a reserved
27
+ * namespace. A unit whose ref an application chose freely still fails closed rather than acquiring
28
+ * an implicit route.
26
29
  */
27
30
  export const APPLICATION_CONSUMER_DOCUMENTATION_AUTHORED_CONTENT_V1 = [
28
31
  {
@@ -737,11 +740,6 @@ administration surface permits that sequence. Do not mark it as default yet.
737
740
 
738
741
  {{CONSUMER_FACT:source:consumer-fact:access-single-sign-on#connectionConfigurationMarkdown}}
739
742
 
740
- > **Current limitation:** keep \`bypassAppMFA\` off. The configuration field is
741
- > present, but the current authentication runtime does not use it to decide
742
- > whether the application requests another factor. Prove the actual sign-in
743
- > journey with a controlled account; do not use this field as audit evidence.
744
-
745
743
  > **SSO role mapping is an access grant.** Test every mapped value, keep the
746
744
  > fallback role non-administrative, and verify an expected refusal. A provider
747
745
  > group name should never become broad application authority merely because it
@@ -974,7 +972,7 @@ that can reveal a mapping defect:
974
972
  | Newly eligible person, when first-sign-in creation is enabled | The intended user and membership lifecycle occurs with the fallback role |
975
973
  | Person with a mapped provider role or group | The exact external value maps to the intended application role |
976
974
  | Person outside an allowed domain or mapping | The connection refuses the identity without revealing another account |
977
- | Person with application MFA requirements | The actual post-provider journey is observed; do not infer it from the currently non-operative \`bypassAppMFA\` field |
975
+ | Person with application MFA requirements | The actual post-provider journey is observed. A connection cannot exempt anyone from the application's requirement: the declared policy is enforced on the federated lane too, and an organization may only tighten it |
978
976
  | Independent recovery administrator | Provider outage or mapping failure does not remove all administrative access |
979
977
 
980
978
  Use controlled test identities and non-sensitive application actions. Do not
@@ -1595,11 +1593,13 @@ not rotate secret material or repair an ownerless key.
1595
1593
 
1596
1594
  ## Close the change with evidence
1597
1595
 
1598
- {{CONSUMER_FACT:source:consumer-fact:access-api-keys#usageStatisticsLimitationMarkdown}}
1596
+ {{CONSUMER_FACT:source:consumer-fact:access-api-keys#usageStatisticsMarkdown}}
1599
1597
 
1600
- Until per-key tracking exists, prove deployment and retirement from controlled
1601
- requests, application audit evidence and the workload's own secret-access and
1602
- execution logs. A page of zero counters is not a safe deletion decision.
1598
+ After a rotation, the new key should show accepted requests and a recent
1599
+ last-accepted time, and the key it replaced should stop being accepted. The
1600
+ counters cover a rolling week, so a key a workload uses less often than weekly
1601
+ can show none: read its last-accepted time before calling it unused, and confirm
1602
+ with the owning workload before deleting a key that time does not settle.
1603
1603
 
1604
1604
  Retain a non-secret lifecycle record containing:
1605
1605
 
@@ -1649,11 +1649,14 @@ flowchart TD
1649
1649
  The non-secret prefix helps identify the credential record; it cannot prove
1650
1650
  that the workload received the current complete secret.
1651
1651
 
1652
- {{CONSUMER_FACT:source:consumer-fact:access-api-keys#usageStatisticsLimitationMarkdown}}
1652
+ {{CONSUMER_FACT:source:consumer-fact:access-api-keys#usageStatisticsMarkdown}}
1653
1653
 
1654
- Do not diagnose an apparently unused key from those counters. Correlate the
1655
- workload's execution logs, secret-access logs, application audit trail and one
1656
- controlled request instead.
1654
+ Only requests the application ACCEPTED the key for are counted. A key sent with
1655
+ the wrong secret, past its expiry or after deactivation is refused and leaves no
1656
+ count, and neither does a request stopped before it reaches the application. So
1657
+ a key with no recent use points at the workload not sending it; failures on a
1658
+ key with recent use point at the request itself (its scope, roles or payload).
1659
+ Confirm either reading with one controlled request.
1657
1660
 
1658
1661
  The request must carry the complete opaque value in this maintained header
1659
1662
  shape:
@@ -2196,7 +2199,7 @@ The maintained registered-client lifecycle is:
2196
2199
 
2197
2200
  {{CONSUMER_FACT:source:consumer-fact:access-oauth-clients#lifecycleMarkdown}}
2198
2201
 
2199
- {{CONSUMER_FACT:source:consumer-fact:access-oauth-clients#currentUsageEvidenceMarkdown}}
2202
+ {{CONSUMER_FACT:source:consumer-fact:access-oauth-clients#usageEvidenceMarkdown}}
2200
2203
 
2201
2204
  ## Change the correct lifecycle layer
2202
2205
 
@@ -3494,9 +3497,10 @@ credentials and unnecessary personal data.`,
3494
3497
 
3495
3498
  SCIM lets an identity directory maintain a defined population of users and
3496
3499
  organization memberships. Choose it when your directory should own repeatable
3497
- joiner, mover and leaver changes. The application supports **SCIM Users**, not
3498
- SCIM Groups; a directory \`department\` can be mapped to one existing
3499
- organization unit.
3500
+ joiner, mover and leaver changes. The application supports **SCIM Users** and
3501
+ **SCIM Groups**. A directory \`department\` can be mapped to one existing
3502
+ organization unit, and a directory group can become an organization unit of its
3503
+ own — see *Provision organization units from your directory*.
3500
3504
 
3501
3505
  > **SCIM provisions access; it does not sign people in.** Configure and prove
3502
3506
  > single sign-on separately. A directory-managed person needs both a correctly
@@ -3588,8 +3592,8 @@ same membership or unit assignment.`,
3588
3592
 
3589
3593
  Use this page to decide whether a directory or provisioning bridge is compatible
3590
3594
  with this application **before** configuring production users. The application
3591
- implements a focused SCIM 2.0 User service. It is not a generic LDAP endpoint and
3592
- it does not implement SCIM Groups.
3595
+ implements a focused SCIM 2.0 User and Group service. It is not a generic LDAP
3596
+ endpoint, and its Group resource maps to organization units rather than to roles.
3593
3597
 
3594
3598
  ## Supported profile at a glance
3595
3599
 
@@ -3597,12 +3601,12 @@ it does not implement SCIM Groups.
3597
3601
  | --- | --- | --- |
3598
3602
  | Protocol | SCIM 2.0 over HTTPS with \`application/scim+json\` | SCIM 1.1 and direct LDAP binds are not accepted |
3599
3603
  | Authentication | A dedicated organization SCIM bearer token | The token selects one organization; it is not a user session or ordinary API key |
3600
- | Resources | \`Users\` plus SCIM discovery documents | \`Groups\` is not implemented; group assignment can scope which users the provider sends but must not call \`/Groups\` |
3601
- | User operations | Create, list, read, full replace, partial update and deactivate; Bulk accepts up to 100 operations | Organization-unit reconciliation differs by operation, as shown below |
3604
+ | Resources | \`Users\`, \`Groups\` and SCIM discovery documents | A \`Group\` is an organization unit, not a role. It is available only once an administrator sets the unit role on the SCIM provisioning configuration; until then every \`/Groups\` request answers 403 |
3605
+ | User operations | Create, list, read, full replace, partial update and deactivate; Bulk accepts up to 100 User or Group operations | Organization-unit reconciliation differs by operation, as shown below |
3602
3606
  | Filtering | User lookup filters with a published maximum result size of 200 | Test the provider’s exact matching query before broad rollout |
3603
3607
  | Password changes | Not supported | Use the configured human sign-in or SSO journey; do not synchronize directory passwords |
3604
3608
  | Sorting and ETags | Not supported | A provider must not require sorting or conditional ETag writes |
3605
- | Request budget | 300 requests per minute for each SCIM token | A 429 response includes retry information; reduce concurrency rather than rotating addresses |
3609
+ | Request budget | 6,000 requests per minute for each SCIM token, sized for the request bursts Microsoft Entra ID and Okta send (neither uses Bulk) | A 429 response carries an integer \`Retry-After\`; follow it rather than rotating addresses |
3606
3610
 
3607
3611
  The public discovery documents are available beneath the SCIM base URL:
3608
3612
 
@@ -3648,7 +3652,7 @@ and does not prove that the person can complete SSO.
3648
3652
  | Provider requirement | Compatible expectation |
3649
3653
  | --- | --- |
3650
3654
  | Discovery | The provider can read \`ServiceProviderConfig\`, \`Schemas\` and \`ResourceTypes\` and respect the advertised feature set |
3651
- | Resource types | User provisioning works without calling \`/Groups\` |
3655
+ | Resource types | \`/ResourceTypes\` lists both \`User\` and \`Group\`. User provisioning works whether or not the provider calls \`/Groups\` |
3652
3656
  | Update behavior | The provider can operate with the documented PUT/PATCH consequences, especially when department controls unit access |
3653
3657
  | Authentication | The provider can send the dedicated bearer token in the HTTPS \`Authorization\` header |
3654
3658
  | Matching and pagination | Its exact user filter and result-window behavior work within the published limit |
@@ -3711,9 +3715,9 @@ matched exactly, after trimming, against the organization-unit mapping.
3711
3715
  | --- | --- | --- |
3712
3716
  | \`POST /Users\` | Creates or links the person according to the lifecycle configuration | Reconciles an exact mapped department when unit mapping and a default unit role are configured |
3713
3717
  | \`PUT /Users/{id}\` | Replaces the maintained profile and active state | Performs authoritative unit reconciliation from the full department value |
3714
- | \`PATCH /Users/{id}\` | Applies supported partial profile or active-state changes | **Does not currently reconcile organization units** |
3718
+ | \`PATCH /Users/{id}\` | Applies supported partial profile or active-state changes | Reconciles units only when the PATCH sets or removes the department; a PATCH that does not touch the department leaves unit assignments unchanged |
3715
3719
  | \`DELETE /Users/{id}\` | Runs the configured deactivation behavior; it does not physically erase the person | Does not perform a department-to-unit reconciliation |
3716
- | \`POST /Bulk\` | Executes supported user operations individually | **Does not currently reconcile organization units**, including Bulk PUT operations |
3720
+ | \`POST /Bulk\` | Executes each User or Group operation individually, exactly as the same request would on its own | The same effect as the individual operation: a Bulk PUT reconciles like \`PUT\`, a Bulk PATCH like \`PATCH\`. A \`bulkId:\` reference to a resource created earlier in the same request is replaced by its id, so one request can create a user and add them to a new group |
3717
3721
 
3718
3722
  This difference matters with providers that normally send PATCH. Do not enable
3719
3723
  authoritative department-to-unit mapping merely because user creation worked.
@@ -3858,18 +3862,24 @@ plaintext secret is returned once; store it immediately in the identity
3858
3862
  provider’s secret store. Keep it out of source control, screenshots, logs,
3859
3863
  tickets and reusable examples.
3860
3864
 
3861
- The current request budget is **300 requests per minute per token**. When the
3862
- service returns a rate limit, follow its retry information and reduce
3863
- concurrency instead of starting parallel retries.
3865
+ The current request budget is **6,000 requests per minute per token**. It is
3866
+ sized for how identity providers really push: neither Microsoft Entra ID nor
3867
+ Okta uses SCIM Bulk, so a first sync arrives as a burst of individual requests.
3868
+ When the service returns a rate limit, it states an integer \`Retry-After\` in
3869
+ seconds; follow it instead of starting parallel retries.
3864
3870
 
3865
3871
  ## Treat deactivation as a high-impact choice
3866
3872
 
3867
- The current deactivation path marks both the global user and the addressed
3868
- organization membership inactive. For a person who belongs to several
3869
- organizations, this can affect more than the directory-owned membership. Test
3870
- that case before production rollout. A later \`active:true\` does not prove that
3871
- the organization membership was restored; verify both layers before announcing
3872
- recovery.`,
3873
+ Deactivation withdraws the person's membership in **this organization only**,
3874
+ together with the access that membership conferred. Their account and their
3875
+ memberships in other organizations are not touched: one organization's
3876
+ directory cannot lock a person out of another.
3877
+
3878
+ A later \`active:true\` restores the membership with the organization's
3879
+ **current default role**, not the roles the person held before. Re-grant any
3880
+ additional role deliberately. A person whose account was disabled by the
3881
+ application operator is not re-enabled by the directory; restoring them is the
3882
+ operator's decision.`,
3873
3883
  },
3874
3884
  {
3875
3885
  managedPath: 'user-administration/scim-microsoft-entra.md',
@@ -3944,18 +3954,36 @@ Keep the first mapping small and observable:
3944
3954
  | Account-enabled expression | \`active\` | Test disable and re-enable as separate access events |
3945
3955
  | \`department\` | Enterprise User \`department\` | Enable only if department is an access-control authority |
3946
3956
 
3947
- This application currently exposes **Users**, not SCIM **Groups**. Disable group
3948
- object provisioning and Push Groups-style expectations. Entra groups may still
3949
- be useful on the Entra side to decide who is assigned to the enterprise
3950
- application, but they are not imported as application groups.
3957
+ This application exposes **Users** and **Groups**. A pushed Entra group becomes
3958
+ an organization UNIT, and its members become assignments in that unit carrying
3959
+ the unit role configured on the SCIM provisioning configuration — it does not
3960
+ become a role or a permission set. Enable group provisioning only if you intend
3961
+ your directory's groups to define unit access; leave it off and Entra groups
3962
+ remain purely an Entra-side way to decide who is assigned to the enterprise
3963
+ application.
3964
+
3965
+ Two consequences to plan for. A group this application did not create is never
3966
+ adopted, so an Entra group whose name matches a unit an administrator authored
3967
+ creates a second unit rather than taking over the first. And a group Entra
3968
+ deletes takes its unit, and every assignment in it, with it.
3969
+
3970
+ While the directory is connected, a unit it created is **managed by the
3971
+ directory**: its name and its members are refused if changed in this
3972
+ application, because the next push would put them back. The organization-units
3973
+ screen marks such a unit with its source (SCIM) and the directory's own group
3974
+ identifier. Rename the group, or change who is in it, in Entra. An assignment's
3975
+ unit role, and the unit's code, type, status and position, are not
3976
+ directory-managed and stay editable here. If the directory is disconnected —
3977
+ every SCIM token revoked — the unit becomes editable like any other.
3951
3978
 
3952
3979
  ## Treat department-to-unit mapping as a controlled rollout
3953
3980
 
3954
- The application reconciles organization units on direct \`POST /Users\` and full
3955
- \`PUT /Users/{id}\` operations. It does **not** currently reconcile units on
3956
- \`PATCH\` or \`Bulk\`. Entra can use PATCH for attribute changes, so a successful
3957
- profile update does not prove that moving a person between departments removed
3958
- their former unit access.
3981
+ The application reconciles organization units on \`POST /Users\`, on full
3982
+ \`PUT /Users/{id}\`, and on a \`PATCH\` that sets or removes the department — and
3983
+ on the same operations inside \`Bulk\`. A PATCH that does not touch the department
3984
+ leaves unit assignments unchanged. Entra sends PATCH for attribute changes, so
3985
+ confirm that a department move actually reaches the application as a department
3986
+ change before relying on it to remove former unit access.
3959
3987
 
3960
3988
  Before making department authoritative:
3961
3989
 
@@ -4030,10 +4058,20 @@ another Okta application whose provisioning connector lets you supply a SCIM
4030
4058
  base URL and bearer token. If the application later has a reviewed Okta
4031
4059
  Integration Network entry, follow that entry instead of duplicating it.
4032
4060
 
4033
- The application accepts SCIM **User** resources. It does not currently expose a
4034
- SCIM Group resource, so do not enable Push Groups or depend on group-object
4035
- imports. An Okta group can still control which users are assigned to the Okta
4036
- application.
4061
+ The application accepts SCIM **User** and **Group** resources. A pushed group
4062
+ becomes an organization UNIT rather than a role: its members receive the unit
4063
+ role configured on the SCIM provisioning configuration, which confines which
4064
+ records they reach and never widens their permissions. Enable Push Groups only
4065
+ if that is what you intend; otherwise an Okta group can still control which users
4066
+ are assigned to the Okta application without being pushed.
4067
+
4068
+ Note that Okta creates a group without an \`externalId\`, which this application
4069
+ handles: the group is identified by the id returned when it was created.
4070
+
4071
+ A pushed group's name and members are managed by Okta while it stays connected:
4072
+ changing either in this application is refused, because the next push would
4073
+ restore it. Make those changes in Okta; unit roles and the unit's other settings
4074
+ stay editable here.
4037
4075
 
4038
4076
  ## Connect Okta
4039
4077
 
@@ -4068,10 +4106,11 @@ Map Okta’s department to the SCIM Enterprise User extension only when it is
4068
4106
  authoritative enough to change access. Then map exact department values to
4069
4107
  existing application organization units.
4070
4108
 
4071
- > **Operation limitation:** organization-unit reconciliation currently runs for
4072
- > direct user creation and full replacement. It does not run for PATCH or Bulk.
4073
- > Capture the operation Okta sends for a department change and prove that the
4074
- > old unit assignment is removed before production rollout.
4109
+ > **Operation boundary:** organization-unit reconciliation runs on user creation,
4110
+ > full replacement, and a PATCH that sets or removes the department, including the
4111
+ > same operations inside Bulk. A PATCH that does not touch the department leaves
4112
+ > unit assignments unchanged. Capture the operation Okta sends for a department
4113
+ > change and prove that the old unit assignment is removed before production rollout.
4075
4114
 
4076
4115
  ## Prove one complete lifecycle
4077
4116
 
@@ -4152,7 +4191,7 @@ compliant SCIM User. A common starting point is:
4152
4191
  | \`sn\` | \`name.familyName\` | Empty-value behavior |
4153
4192
  | \`displayName\` | \`displayName\` | Which system owns later edits |
4154
4193
  | \`department\` | Enterprise User \`department\` | Whether it is authoritative for unit access |
4155
- | Disabled-account state | \`active:false\` | Global user and membership deactivation consequence |
4194
+ | Disabled-account state | \`active:false\` | Withdraws the membership in this organization only; the account and other memberships stay |
4156
4195
 
4157
4196
  These are mapping decisions, not guaranteed attributes in every LDAP schema.
4158
4197
  Inspect representative entries and document the source object classes,
@@ -4198,8 +4237,10 @@ A production bridge needs all of the following:
4198
4237
  - a tested response to rate limiting, token rotation and partial batch failure.
4199
4238
 
4200
4239
  Do not use Bulk for a first implementation merely for speed. The application
4201
- supports a bounded Bulk request, but Bulk currently does not perform
4202
- organization-unit reconciliation. Start with observable individual operations.
4240
+ supports a bounded Bulk request whose operations behave exactly as the same
4241
+ individual requests, but a Bulk response reports each operation's status
4242
+ separately, which makes failures harder to observe. Start with observable
4243
+ individual operations.
4203
4244
 
4204
4245
  ## Validate before production
4205
4246
 
@@ -4304,8 +4345,9 @@ flowchart LR
4304
4345
  Reconciliation becomes active only with at least one explicit mapping and a
4305
4346
  default unit role. On supported direct user creation and full replacement, the
4306
4347
  directory becomes authoritative: a changed, blank or unmapped department can
4307
- remove former assignments, including manual ones. **PATCH and Bulk do not
4308
- currently perform this reconciliation.** Prove the exact operation used by
4348
+ remove former assignments, including manual ones. A PATCH performs this
4349
+ reconciliation only when it sets or removes the department; Bulk operations
4350
+ behave as the same individual requests. Prove the exact operation used by
4309
4351
  your identity provider.`,
4310
4352
  },
4311
4353
  {
@@ -4345,8 +4387,9 @@ unit assignment and sign-in behavior after every change.
4345
4387
  unit assignment was removed.
4346
4388
  6. **Send blank, unmapped and wrong-case departments.** Verify the exact result
4347
4389
  before making mapping authoritative.
4348
- 7. **Deactivate a multi-organization person.** Inspect both the global user and
4349
- every affected membership.
4390
+ 7. **Deactivate a multi-organization person.** Confirm that only this
4391
+ organization's membership became inactive and their other memberships
4392
+ are unchanged.
4350
4393
  8. **Recover the person.** Confirm that the user and intended membership are
4351
4394
  both **Active** and that enterprise sign-in succeeds.
4352
4395
 
@@ -4417,7 +4460,7 @@ change completed successfully.
4417
4460
  | **409** | An existing identity or membership conflicts; inspect it instead of creating a duplicate |
4418
4461
  | **429** | Follow retry information and reduce concurrency |
4419
4462
  | Profile value is missing | Test the exact mapping expression against the real directory payload |
4420
- | Unit did not change | Confirm exact department value and case, explicit mapping, existing unit, default role and a supported direct create/full replacement operation |
4463
+ | Unit did not change | Confirm exact department value and case, explicit mapping, existing unit, default role, and that the operation carried the department (create, full replacement, or a PATCH that sets it) |
4421
4464
  | Person remains unable to sign in | Check enterprise sign-in, global user state and organization membership state separately |
4422
4465
 
4423
4466
  ## Recover safely
@@ -4898,7 +4941,8 @@ parser, transformation, index or detection rule accepted the event.
4898
4941
  | One HTTPS request containing one JSON object, with a static header or HMAC credential | Test direct delivery | This matches the current structured-JSON worker closely |
4899
4942
  | A provider-specific wrapper around the event | Use a narrow relay unless the exact endpoint accepts the native envelope | The relay owns the wrapper while preserving source identifiers |
4900
4943
  | Short-lived OAuth access tokens or managed identity | Use a provider-side relay | Token acquisition and refresh do not belong in a static credential field |
4901
- | A JSON array or provider batch protocol | Use a relay that batches deliberately | Current delivery is one event per request; configured batch fields are reserved |
4944
+ | A plain JSON array of events | Test direct delivery with \`batchSize\` above 1 | A batch of \`json_structured\` or \`ocsf\` events is sent as one JSON array |
4945
+ | A provider-specific batch protocol | Use a relay that batches deliberately | Batching sends a plain array or one line per event, never a provider wrapper |
4902
4946
  | A syslog, agent, queue or private-network input | Use an adapter or relay inside that boundary | The application sends outbound HTTPS webhooks, not those transports |
4903
4947
  | CEF, LEEF or OCSF ingestion | Test actual emitted samples with the receiver | A format name does not prove field mapping, escaping, severity or class compatibility |
4904
4948
 
@@ -4956,13 +5000,92 @@ application path you operate.
4956
5000
 
4957
5001
  {{CONSUMER_FACT:source:consumer-fact:organization-siem-export#deliveryValuesMarkdown}}
4958
5002
 
4959
- The current worker posts **one event per HTTP request**. Do not configure a
4960
- receiver, load balancer or billing estimate on the assumption that \`batchSize\`
4961
- or \`batchWindowSeconds\` reduces request volume. The
4962
- \`includeRawEventData\` and \`includeDeviceContext\` flags are also reserved in
4963
- the current runtime: changing them does not remove those fields from the emitted
4964
- envelope. Treat data minimization at the receiver as necessary until those
4965
- configuration controls are implemented end to end.
5003
+ With the default \`batchSize\` of 1, each event is its own HTTP request. Set
5004
+ \`batchSize\` above 1 and this destination's events wait, then travel together:
5005
+ a batch is sent as soon as \`batchSize\` events are waiting, or when the oldest has
5006
+ waited \`batchWindowSeconds\`. A batch is one request body, framed the way its format
5007
+ frames several records:
5008
+
5009
+ | Format | Body of a batch |
5010
+ | --- | --- |
5011
+ | \`json_structured\`, \`ocsf\` | A JSON array of the events |
5012
+ | \`cef\`, \`leef\` | One line per event, separated by newlines |
5013
+
5014
+ A batch that holds one event is sent exactly like a single event, with no array and
5015
+ no trailing newline, so a receiver written for one event per request keeps working
5016
+ until you raise \`batchSize\`. If the receiver answers \`413 Payload Too Large\`, the
5017
+ batch is halved and sent again until the receiver accepts it; the events left out
5018
+ go in the next request. Size a receiver, load balancer or billing estimate on the
5019
+ batch size you choose.
5020
+
5021
+ ## Limit what an exported event carries
5022
+
5023
+ \`exportProjection\` decides what this destination receives. It is the only place
5024
+ an export can be narrowed **before** the data leaves; everything else — a filter,
5025
+ a severity minimum — decides *whether* an event is sent, not *what* it contains.
5026
+
5027
+ Set it per destination, not per application: two receivers under two different
5028
+ agreements are two different answers.
5029
+
5030
+ | Declaration | Admits |
5031
+ | --- | --- |
5032
+ | \`disclosedTiers: ["attribution"]\` | the user's email address, IP address, user agent, geolocation and client-install identifier |
5033
+ | \`disclosedTiers: ["context"]\` | correlation identifier, originating frontend, organization and application names, authentication method and source |
5034
+ | \`disclosedTiers: ["detail"]\` | the per-event \`eventData\` object **and the outcome reason**, subject to the next row |
5035
+ | \`disclosedEventDataClasses: ["administrative"]\` | only the \`eventData\` of events describing configuration or system state |
5036
+ | \`disclosedEventDataClasses: ["subject-detail"]\` | also the \`eventData\` of events describing a person |
5037
+
5038
+ **Declaring \`detail\` while withholding \`attribution\` is the mistake to avoid.**
5039
+ An authentication event's \`eventData\` carries the email address and IP address
5040
+ that withholding attribution was meant to keep back, so the narrowing reads as a
5041
+ control while changing nothing that matters. Pair it with
5042
+ \`disclosedEventDataClasses: ["administrative"]\`.
5043
+
5044
+ The outcome reason sits in \`detail\` rather than \`context\` for the same reason,
5045
+ and it is worth understanding before you rely on either tier. It is not a field of
5046
+ its own: the application lifts it out of the event's own \`eventData\`. Most of the
5047
+ time it is a short, impersonal failure reason — but **19 event types carry a
5048
+ reason somebody typed**, including organization lifecycle changes, emergency
5049
+ access, forced password resets and retained-data access, where it is the
5050
+ operator's own words and may name anyone. Withholding an event's detail therefore
5051
+ withholds its reason too.
5052
+
5053
+ A **floor always survives** whatever you declare: event identifier, event type,
5054
+ category, severity, timestamp, organization, the acting user's identifier, source
5055
+ service, source version, source environment, and outcome. Two reasons, and only
5056
+ the first is about privacy. The event identifier is what your receiver
5057
+ de-duplicates on, and deliveries are retried — an export minimized past it
5058
+ produces duplicates in your SIEM rather than fewer records. The event type,
5059
+ severity and source version are header fields of the CEF and LEEF grammars, which
5060
+ are positional: omitting one does not shorten the record, it corrupts every field
5061
+ after it. The acting user's identifier is an opaque reference, never a name or an
5062
+ address, so it lets you correlate one actor's activity without receiving their
5063
+ identity — which is usually the trade a minimized export exists to make.
5064
+
5065
+ One capability cost to know about, because nothing warns you at the time:
5066
+ withholding \`detail\` makes OCSF exports coarser. The application refines an
5067
+ API-activity event's \`activity_id\` by reading the verb out of \`eventData\`, so
5068
+ with the object withheld a create and a delete both report the generic
5069
+ \`Other\` activity and share a \`type_uid\`. The event type is still carried in
5070
+ \`activity_name\` and \`metadata.event_code\`, so nothing is wrong — but a
5071
+ detection rule or dashboard that groups by \`type_uid\` will stop separating them.
5072
+ CEF, LEEF and structured JSON are unaffected.
5073
+
5074
+ Withheld fields are **absent**, not empty. No blank CEF custom-string slot, no
5075
+ null JSON key, no empty OCSF attribute — so a receiver's "field is present but
5076
+ empty" rule will not fire, and a rule keyed on a withheld field simply never
5077
+ matches. The same projection applies to every wire format, because it is applied
5078
+ once, before the event is signed and queued, rather than per format.
5079
+
5080
+ Omit the whole block and the destination receives the full envelope. That is the
5081
+ behaviour of every destination configured before this control existed, so
5082
+ introducing it changes nothing until you declare a narrowing.
5083
+
5084
+ Verify a narrowing the way you verify a filter: perform one controlled event,
5085
+ read the received copy, and confirm both that the withheld fields are absent and
5086
+ that the event identifier still matches the source audit record. Minimization
5087
+ does not alter the source audit trail — the full record remains in the
5088
+ application, and a narrowed feed is not evidence that less was recorded.
4966
5089
 
4967
5090
  ## Filter for purpose and volume
4968
5091
 
@@ -5102,7 +5225,7 @@ Recommended application settings:
5102
5225
  | Destination | Relay HTTPS URL dedicated to the organization/environment |
5103
5226
  | Authentication | \`hmac_sha256\` or a dedicated \`api_key_header\` |
5104
5227
  | Format | \`json_structured\` |
5105
- | Delivery | One event per request; choose timeout/retry values below the relay’s bounded acknowledgement time |
5228
+ | Delivery | \`batchSize\` 1 (one event per request) unless the relay accepts a JSON array; choose timeout/retry values below the relay’s bounded acknowledgement time |
5106
5229
 
5107
5230
  If a controlled test proves direct HEC compatibility, configure:
5108
5231
 
@@ -5154,9 +5277,9 @@ this guide defines the application envelope that must be conserved.`,
5154
5277
  Microsoft Sentinel commonly receives custom data through the Azure Monitor Logs
5155
5278
  Ingestion API. That API requires a Data Collection Rule (DCR), a matching JSON
5156
5279
  schema and Microsoft Entra OAuth authorization. The application’s SIEM exporter
5157
- uses a static outbound credential and posts one JSON object per event; it does
5158
- not acquire or refresh Azure OAuth tokens and does not wrap events as the JSON
5159
- array expected by Logs Ingestion. **Use an Azure-hosted relay rather than pointing
5280
+ uses a static outbound credential and posts one JSON object per event, or a plain
5281
+ JSON array when \`batchSize\` is above 1; it does not acquire or refresh Azure OAuth
5282
+ tokens and does not shape events to the Data Collection Rule's schema. **Use an Azure-hosted relay rather than pointing
5160
5283
  the application directly at the Logs Ingestion API.**
5161
5284
 
5162
5285
  {{CONSUMER_FACT:source:consumer-fact:organization-siem-export#markdown}}
@@ -5350,8 +5473,8 @@ cause uncontrolled field growth.
5350
5473
  the document is absent.
5351
5474
  6. Return a temporary 503, restore the endpoint and prove dead-letter recovery
5352
5475
  without an unintended duplicate detection.
5353
- 7. Record receiver capacity for **one request per selected event**; application
5354
- batching fields are currently reserved and do not reduce that rate.
5476
+ 7. Record receiver capacity for the request rate you configure: **one request per
5477
+ selected event** at the default \`batchSize\` of 1, or one per batch above it.
5355
5478
 
5356
5479
  ## Elastic documentation to keep with the runbook
5357
5480
 
@@ -7177,7 +7300,7 @@ A concrete request and its response, using the members of your own organization:
7177
7300
 
7178
7301
  ~~~bash
7179
7302
  curl --fail-with-body \\
7180
- --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members?page=1&limit=20&sort=joinedAt:desc" \\
7303
+ --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members?page=1&limit=20&sort=createdAt:desc" \\
7181
7304
  --header "Authorization: $ORGANIZATION_API_KEY" \\
7182
7305
  --header "accept: application/json"
7183
7306
  ~~~
@@ -7283,7 +7406,7 @@ Now list the organization's members. This exercises the collection envelope you
7283
7406
 
7284
7407
  ~~~bash
7285
7408
  curl --fail-with-body \\
7286
- --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members?limit=5&sort=joinedAt:desc" \\
7409
+ --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members?limit=5&sort=createdAt:desc" \\
7287
7410
  --header "Authorization: $ORGANIZATION_API_KEY" \\
7288
7411
  --header "accept: application/json"
7289
7412
  ~~~
@@ -7348,7 +7471,7 @@ An empty \`data\` array on page 1 is a valid answer. Confirm the organization an
7348
7471
  page=1
7349
7472
  while : ; do
7350
7473
  response=$(curl --fail-with-body --silent \\
7351
- --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members?page=$page&limit=100&sort=joinedAt:asc" \\
7474
+ --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members?page=$page&limit=100&sort=createdAt:asc" \\
7352
7475
  --header "Authorization: $ORGANIZATION_API_KEY" \\
7353
7476
  --header "accept: application/json")
7354
7477
  echo "$response" | jq -c '.data[]' >> members.ndjson
@@ -7360,7 +7483,7 @@ done
7360
7483
 
7361
7484
  Three rules keep a scan correct:
7362
7485
 
7363
- 1. **Sort by a field the reference lists as sortable, or a stable timestamp** such as \`joinedAt:asc\` for members, when you walk more than one page. A sort field the operation does not accept is ignored, not refused, and the default order applies; sorting by a field that changes during the scan (a status, a name being edited) can move a record between pages and make you skip or repeat it.
7486
+ 1. **Sort by a field the reference lists as sortable, or a stable timestamp** such as \`createdAt:asc\` for members (when the membership was created), when you walk more than one page. A sort field the operation does not accept is ignored, not refused, and the default order applies; sorting by a field that changes during the scan (a status, a name being edited) can move a record between pages and make you skip or repeat it.
7364
7487
  2. **Stop on \`totalPages\`**, not on a short page. The last page is short by definition; an earlier page is short only when records were deleted while you scanned.
7365
7488
  3. **Process each record idempotently** and key your own records on \`_id\`. If the scan is interrupted, resume from the last page whose work you completed; repeating a page is safe when processing is idempotent, skipping one never is.
7366
7489
 
@@ -7370,7 +7493,7 @@ Search operations (\`…/search\`) add \`q\` for free text. Combine it with filt
7370
7493
 
7371
7494
  ~~~bash
7372
7495
  curl --fail-with-body \\
7373
- --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members/search?q=morgan&status=ACTIVE&sort=joinedAt:desc" \\
7496
+ --url "$BASE_URL/api/v1/organizations/$ORGANIZATION_ID/organization-members/search?q=morgan&status=ACTIVE&sort=createdAt:desc" \\
7374
7497
  --header "Authorization: $ORGANIZATION_API_KEY" \\
7375
7498
  --header "accept: application/json"
7376
7499
  ~~~