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

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 (131) 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-generator.d.ts +8 -4
  47. package/dist/esm/companion/openapi-generator.d.ts.map +1 -1
  48. package/dist/esm/companion/openapi-generator.js +39 -17
  49. package/dist/esm/companion/openapi-generator.js.map +1 -1
  50. package/dist/esm/companion/operation-projection.schemas.d.ts +21 -1
  51. package/dist/esm/companion/operation-projection.schemas.d.ts.map +1 -1
  52. package/dist/esm/companion/operation-projection.schemas.js +11 -0
  53. package/dist/esm/companion/operation-projection.schemas.js.map +1 -1
  54. package/dist/esm/companion/publish-result.types.d.ts.map +1 -1
  55. package/dist/esm/companion/publish-result.types.js.map +1 -1
  56. package/dist/esm/companion/rendering/technical-documentation-authorized-bundle-reader.d.ts.map +1 -1
  57. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.d.ts.map +1 -1
  58. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js +8 -0
  59. package/dist/esm/companion/rendering/technical-documentation-docusaurus-renderer.js.map +1 -1
  60. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.d.ts.map +1 -1
  61. package/dist/esm/companion/rendering/technical-documentation-managed-tree-validator.js.map +1 -1
  62. package/dist/esm/companion/rendering/technical-documentation-openapi-renderer.d.ts.map +1 -1
  63. package/dist/esm/companion/rendering/technical-documentation-render-model.d.ts.map +1 -1
  64. package/dist/esm/companion/rendering/technical-documentation-render-model.js +26 -10
  65. package/dist/esm/companion/rendering/technical-documentation-render-model.js.map +1 -1
  66. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.d.ts.map +1 -1
  67. package/dist/esm/companion/rendering/technical-documentation-search-index-renderer.js.map +1 -1
  68. package/dist/esm/companion/technical-documentation-asset-path.d.ts.map +1 -1
  69. package/dist/esm/companion/technical-documentation-capture-execution-port.d.ts.map +1 -1
  70. package/dist/esm/companion/technical-documentation-capture-execution-port.js.map +1 -1
  71. package/dist/esm/companion/technical-documentation-diagram-definitions.d.ts.map +1 -1
  72. package/dist/esm/companion/technical-documentation-diagram-definitions.js.map +1 -1
  73. package/dist/esm/companion/technical-documentation-diagram-materializer.d.ts.map +1 -1
  74. package/dist/esm/companion/technical-documentation-diagram-materializer.js.map +1 -1
  75. package/dist/esm/companion/technical-documentation-placeholder-materializer.d.ts.map +1 -1
  76. package/dist/esm/companion/zod-to-openapi.d.ts.map +1 -1
  77. package/dist/esm/companion-exports.d.ts.map +1 -1
  78. package/dist/esm/config/define-tech-doc-config.d.ts.map +1 -1
  79. package/dist/esm/config/index.d.ts.map +1 -1
  80. package/dist/esm/config/wildo-tech-doc-config.schemas.d.ts.map +1 -1
  81. package/dist/esm/config/wildo-tech-doc-config.schemas.js.map +1 -1
  82. package/dist/esm/content/application-consumer-documentation-content-manifest.schemas.d.ts.map +1 -1
  83. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts +18 -15
  84. package/dist/esm/content/application-consumer-documentation-content.techdoc.d.ts.map +1 -1
  85. package/dist/esm/content/application-consumer-documentation-content.techdoc.js +169 -61
  86. package/dist/esm/content/application-consumer-documentation-content.techdoc.js.map +1 -1
  87. package/dist/esm/content.exports.d.ts.map +1 -1
  88. package/dist/esm/index.d.ts.map +1 -1
  89. package/dist/esm/openapi/api-reference-link-index.d.ts.map +1 -1
  90. package/dist/esm/openapi/index.d.ts.map +1 -1
  91. package/dist/esm/openapi/openapi-generation-output.schemas.d.ts.map +1 -1
  92. package/dist/esm/openapi-reference-model.exports.d.ts.map +1 -1
  93. package/dist/esm/runtime/AuthExchangePage.d.ts.map +1 -1
  94. package/dist/esm/runtime/DocsAuthContext.d.ts +2 -2
  95. package/dist/esm/runtime/DocsAuthContext.d.ts.map +1 -1
  96. package/dist/esm/runtime/DocsAuthContext.js +8 -4
  97. package/dist/esm/runtime/DocsAuthContext.js.map +1 -1
  98. package/dist/esm/runtime/DocsFrontendProviders.d.ts +16 -0
  99. package/dist/esm/runtime/DocsFrontendProviders.d.ts.map +1 -0
  100. package/dist/esm/runtime/DocsFrontendProviders.js +26 -0
  101. package/dist/esm/runtime/DocsFrontendProviders.js.map +1 -0
  102. package/dist/esm/runtime/decode-jwt-claims.d.ts.map +1 -1
  103. package/dist/esm/runtime/docs-auth-client.d.ts.map +1 -1
  104. package/dist/esm/runtime/docs-auth-session.schemas.d.ts.map +1 -1
  105. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts +1 -2
  106. package/dist/esm/runtime/frontend-provider-registry.techdoc.d.ts.map +1 -1
  107. package/dist/esm/runtime/frontend-provider-registry.techdoc.js.map +1 -1
  108. package/dist/esm/runtime/index.d.ts +2 -0
  109. package/dist/esm/runtime/index.d.ts.map +1 -1
  110. package/dist/esm/runtime/index.js +2 -0
  111. package/dist/esm/runtime/index.js.map +1 -1
  112. package/dist/esm/runtime/openapi-reference-conservation.d.ts.map +1 -1
  113. package/dist/esm/runtime/openapi-reference-model.d.ts +5 -0
  114. package/dist/esm/runtime/openapi-reference-model.d.ts.map +1 -1
  115. package/dist/esm/runtime/openapi-reference-model.js +5 -0
  116. package/dist/esm/runtime/openapi-reference-model.js.map +1 -1
  117. package/dist/esm/runtime/openapi-reference-view.js +1 -1
  118. package/dist/esm/runtime/openapi-reference-view.js.map +1 -1
  119. package/dist/esm/runtime/use-docs-auth-session.d.ts.map +1 -1
  120. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts +1 -0
  121. package/dist/esm/runtime/use-docs-frontend-provider-registry.d.ts.map +1 -1
  122. package/dist/esm/runtime/use-docs-frontend-provider-registry.js +10 -2
  123. package/dist/esm/runtime/use-docs-frontend-provider-registry.js.map +1 -1
  124. package/dist/esm/runtime/use-docs-provider-scripts.d.ts +30 -0
  125. package/dist/esm/runtime/use-docs-provider-scripts.d.ts.map +1 -0
  126. package/dist/esm/runtime/use-docs-provider-scripts.js +40 -0
  127. package/dist/esm/runtime/use-docs-provider-scripts.js.map +1 -0
  128. package/dist/esm/runtime/use-docs-provider-sdks.d.ts.map +1 -1
  129. package/dist/esm/runtime/use-docs-provider-sdks.js.map +1 -1
  130. package/dist/tsconfig.build.tsbuildinfo +1 -1
  131. package/package.json +8 -24
@@ -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
@@ -3494,9 +3492,10 @@ credentials and unnecessary personal data.`,
3494
3492
 
3495
3493
  SCIM lets an identity directory maintain a defined population of users and
3496
3494
  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.
3495
+ joiner, mover and leaver changes. The application supports **SCIM Users** and
3496
+ **SCIM Groups**. A directory \`department\` can be mapped to one existing
3497
+ organization unit, and a directory group can become an organization unit of its
3498
+ own — see *Provision organization units from your directory*.
3500
3499
 
3501
3500
  > **SCIM provisions access; it does not sign people in.** Configure and prove
3502
3501
  > single sign-on separately. A directory-managed person needs both a correctly
@@ -3588,8 +3587,8 @@ same membership or unit assignment.`,
3588
3587
 
3589
3588
  Use this page to decide whether a directory or provisioning bridge is compatible
3590
3589
  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.
3590
+ implements a focused SCIM 2.0 User and Group service. It is not a generic LDAP
3591
+ endpoint, and its Group resource maps to organization units rather than to roles.
3593
3592
 
3594
3593
  ## Supported profile at a glance
3595
3594
 
@@ -3597,12 +3596,12 @@ it does not implement SCIM Groups.
3597
3596
  | --- | --- | --- |
3598
3597
  | Protocol | SCIM 2.0 over HTTPS with \`application/scim+json\` | SCIM 1.1 and direct LDAP binds are not accepted |
3599
3598
  | 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 |
3599
+ | 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 |
3600
+ | 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
3601
  | Filtering | User lookup filters with a published maximum result size of 200 | Test the provider’s exact matching query before broad rollout |
3603
3602
  | Password changes | Not supported | Use the configured human sign-in or SSO journey; do not synchronize directory passwords |
3604
3603
  | 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 |
3604
+ | 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
3605
 
3607
3606
  The public discovery documents are available beneath the SCIM base URL:
3608
3607
 
@@ -3648,7 +3647,7 @@ and does not prove that the person can complete SSO.
3648
3647
  | Provider requirement | Compatible expectation |
3649
3648
  | --- | --- |
3650
3649
  | Discovery | The provider can read \`ServiceProviderConfig\`, \`Schemas\` and \`ResourceTypes\` and respect the advertised feature set |
3651
- | Resource types | User provisioning works without calling \`/Groups\` |
3650
+ | Resource types | \`/ResourceTypes\` lists both \`User\` and \`Group\`. User provisioning works whether or not the provider calls \`/Groups\` |
3652
3651
  | Update behavior | The provider can operate with the documented PUT/PATCH consequences, especially when department controls unit access |
3653
3652
  | Authentication | The provider can send the dedicated bearer token in the HTTPS \`Authorization\` header |
3654
3653
  | Matching and pagination | Its exact user filter and result-window behavior work within the published limit |
@@ -3711,9 +3710,9 @@ matched exactly, after trimming, against the organization-unit mapping.
3711
3710
  | --- | --- | --- |
3712
3711
  | \`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
3712
  | \`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** |
3713
+ | \`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
3714
  | \`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 |
3715
+ | \`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
3716
 
3718
3717
  This difference matters with providers that normally send PATCH. Do not enable
3719
3718
  authoritative department-to-unit mapping merely because user creation worked.
@@ -3858,18 +3857,24 @@ plaintext secret is returned once; store it immediately in the identity
3858
3857
  provider’s secret store. Keep it out of source control, screenshots, logs,
3859
3858
  tickets and reusable examples.
3860
3859
 
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.
3860
+ The current request budget is **6,000 requests per minute per token**. It is
3861
+ sized for how identity providers really push: neither Microsoft Entra ID nor
3862
+ Okta uses SCIM Bulk, so a first sync arrives as a burst of individual requests.
3863
+ When the service returns a rate limit, it states an integer \`Retry-After\` in
3864
+ seconds; follow it instead of starting parallel retries.
3864
3865
 
3865
3866
  ## Treat deactivation as a high-impact choice
3866
3867
 
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.`,
3868
+ Deactivation withdraws the person's membership in **this organization only**,
3869
+ together with the access that membership conferred. Their account and their
3870
+ memberships in other organizations are not touched: one organization's
3871
+ directory cannot lock a person out of another.
3872
+
3873
+ A later \`active:true\` restores the membership with the organization's
3874
+ **current default role**, not the roles the person held before. Re-grant any
3875
+ additional role deliberately. A person whose account was disabled by the
3876
+ application operator is not re-enabled by the directory; restoring them is the
3877
+ operator's decision.`,
3873
3878
  },
3874
3879
  {
3875
3880
  managedPath: 'user-administration/scim-microsoft-entra.md',
@@ -3944,18 +3949,36 @@ Keep the first mapping small and observable:
3944
3949
  | Account-enabled expression | \`active\` | Test disable and re-enable as separate access events |
3945
3950
  | \`department\` | Enterprise User \`department\` | Enable only if department is an access-control authority |
3946
3951
 
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.
3952
+ This application exposes **Users** and **Groups**. A pushed Entra group becomes
3953
+ an organization UNIT, and its members become assignments in that unit carrying
3954
+ the unit role configured on the SCIM provisioning configuration — it does not
3955
+ become a role or a permission set. Enable group provisioning only if you intend
3956
+ your directory's groups to define unit access; leave it off and Entra groups
3957
+ remain purely an Entra-side way to decide who is assigned to the enterprise
3958
+ application.
3959
+
3960
+ Two consequences to plan for. A group this application did not create is never
3961
+ adopted, so an Entra group whose name matches a unit an administrator authored
3962
+ creates a second unit rather than taking over the first. And a group Entra
3963
+ deletes takes its unit, and every assignment in it, with it.
3964
+
3965
+ While the directory is connected, a unit it created is **managed by the
3966
+ directory**: its name and its members are refused if changed in this
3967
+ application, because the next push would put them back. The organization-units
3968
+ screen marks such a unit with its source (SCIM) and the directory's own group
3969
+ identifier. Rename the group, or change who is in it, in Entra. An assignment's
3970
+ unit role, and the unit's code, type, status and position, are not
3971
+ directory-managed and stay editable here. If the directory is disconnected —
3972
+ every SCIM token revoked — the unit becomes editable like any other.
3951
3973
 
3952
3974
  ## Treat department-to-unit mapping as a controlled rollout
3953
3975
 
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.
3976
+ The application reconciles organization units on \`POST /Users\`, on full
3977
+ \`PUT /Users/{id}\`, and on a \`PATCH\` that sets or removes the department — and
3978
+ on the same operations inside \`Bulk\`. A PATCH that does not touch the department
3979
+ leaves unit assignments unchanged. Entra sends PATCH for attribute changes, so
3980
+ confirm that a department move actually reaches the application as a department
3981
+ change before relying on it to remove former unit access.
3959
3982
 
3960
3983
  Before making department authoritative:
3961
3984
 
@@ -4030,10 +4053,20 @@ another Okta application whose provisioning connector lets you supply a SCIM
4030
4053
  base URL and bearer token. If the application later has a reviewed Okta
4031
4054
  Integration Network entry, follow that entry instead of duplicating it.
4032
4055
 
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.
4056
+ The application accepts SCIM **User** and **Group** resources. A pushed group
4057
+ becomes an organization UNIT rather than a role: its members receive the unit
4058
+ role configured on the SCIM provisioning configuration, which confines which
4059
+ records they reach and never widens their permissions. Enable Push Groups only
4060
+ if that is what you intend; otherwise an Okta group can still control which users
4061
+ are assigned to the Okta application without being pushed.
4062
+
4063
+ Note that Okta creates a group without an \`externalId\`, which this application
4064
+ handles: the group is identified by the id returned when it was created.
4065
+
4066
+ A pushed group's name and members are managed by Okta while it stays connected:
4067
+ changing either in this application is refused, because the next push would
4068
+ restore it. Make those changes in Okta; unit roles and the unit's other settings
4069
+ stay editable here.
4037
4070
 
4038
4071
  ## Connect Okta
4039
4072
 
@@ -4068,10 +4101,11 @@ Map Okta’s department to the SCIM Enterprise User extension only when it is
4068
4101
  authoritative enough to change access. Then map exact department values to
4069
4102
  existing application organization units.
4070
4103
 
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.
4104
+ > **Operation boundary:** organization-unit reconciliation runs on user creation,
4105
+ > full replacement, and a PATCH that sets or removes the department, including the
4106
+ > same operations inside Bulk. A PATCH that does not touch the department leaves
4107
+ > unit assignments unchanged. Capture the operation Okta sends for a department
4108
+ > change and prove that the old unit assignment is removed before production rollout.
4075
4109
 
4076
4110
  ## Prove one complete lifecycle
4077
4111
 
@@ -4152,7 +4186,7 @@ compliant SCIM User. A common starting point is:
4152
4186
  | \`sn\` | \`name.familyName\` | Empty-value behavior |
4153
4187
  | \`displayName\` | \`displayName\` | Which system owns later edits |
4154
4188
  | \`department\` | Enterprise User \`department\` | Whether it is authoritative for unit access |
4155
- | Disabled-account state | \`active:false\` | Global user and membership deactivation consequence |
4189
+ | Disabled-account state | \`active:false\` | Withdraws the membership in this organization only; the account and other memberships stay |
4156
4190
 
4157
4191
  These are mapping decisions, not guaranteed attributes in every LDAP schema.
4158
4192
  Inspect representative entries and document the source object classes,
@@ -4198,8 +4232,10 @@ A production bridge needs all of the following:
4198
4232
  - a tested response to rate limiting, token rotation and partial batch failure.
4199
4233
 
4200
4234
  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.
4235
+ supports a bounded Bulk request whose operations behave exactly as the same
4236
+ individual requests, but a Bulk response reports each operation's status
4237
+ separately, which makes failures harder to observe. Start with observable
4238
+ individual operations.
4203
4239
 
4204
4240
  ## Validate before production
4205
4241
 
@@ -4304,8 +4340,9 @@ flowchart LR
4304
4340
  Reconciliation becomes active only with at least one explicit mapping and a
4305
4341
  default unit role. On supported direct user creation and full replacement, the
4306
4342
  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
4343
+ remove former assignments, including manual ones. A PATCH performs this
4344
+ reconciliation only when it sets or removes the department; Bulk operations
4345
+ behave as the same individual requests. Prove the exact operation used by
4309
4346
  your identity provider.`,
4310
4347
  },
4311
4348
  {
@@ -4345,8 +4382,9 @@ unit assignment and sign-in behavior after every change.
4345
4382
  unit assignment was removed.
4346
4383
  6. **Send blank, unmapped and wrong-case departments.** Verify the exact result
4347
4384
  before making mapping authoritative.
4348
- 7. **Deactivate a multi-organization person.** Inspect both the global user and
4349
- every affected membership.
4385
+ 7. **Deactivate a multi-organization person.** Confirm that only this
4386
+ organization's membership became inactive and their other memberships
4387
+ are unchanged.
4350
4388
  8. **Recover the person.** Confirm that the user and intended membership are
4351
4389
  both **Active** and that enterprise sign-in succeeds.
4352
4390
 
@@ -4417,7 +4455,7 @@ change completed successfully.
4417
4455
  | **409** | An existing identity or membership conflicts; inspect it instead of creating a duplicate |
4418
4456
  | **429** | Follow retry information and reduce concurrency |
4419
4457
  | 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 |
4458
+ | 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
4459
  | Person remains unable to sign in | Check enterprise sign-in, global user state and organization membership state separately |
4422
4460
 
4423
4461
  ## Recover safely
@@ -4956,13 +4994,83 @@ application path you operate.
4956
4994
 
4957
4995
  {{CONSUMER_FACT:source:consumer-fact:organization-siem-export#deliveryValuesMarkdown}}
4958
4996
 
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.
4997
+ The current worker posts **one event per HTTP request**, and there is no setting
4998
+ that changes that — size a receiver, load balancer or billing estimate on one
4999
+ request per event.
5000
+
5001
+ Two configuration fields used to sit here promising otherwise — \`batchSize\` and
5002
+ \`batchWindowSeconds\` — each accepted, stored and read by nothing. They were
5003
+ removed rather than documented as reserved: a stored number that does not change
5004
+ behaviour is worse than its absence, because a receiver sized on it is sized wrong.
5005
+
5006
+ ## Limit what an exported event carries
5007
+
5008
+ \`exportProjection\` decides what this destination receives. It is the only place
5009
+ an export can be narrowed **before** the data leaves; everything else — a filter,
5010
+ a severity minimum — decides *whether* an event is sent, not *what* it contains.
5011
+
5012
+ Set it per destination, not per application: two receivers under two different
5013
+ agreements are two different answers.
5014
+
5015
+ | Declaration | Admits |
5016
+ | --- | --- |
5017
+ | \`disclosedTiers: ["attribution"]\` | the user's email address, IP address, user agent, geolocation and client-install identifier |
5018
+ | \`disclosedTiers: ["context"]\` | correlation identifier, originating frontend, organization and application names, authentication method and source |
5019
+ | \`disclosedTiers: ["detail"]\` | the per-event \`eventData\` object **and the outcome reason**, subject to the next row |
5020
+ | \`disclosedEventDataClasses: ["administrative"]\` | only the \`eventData\` of events describing configuration or system state |
5021
+ | \`disclosedEventDataClasses: ["subject-detail"]\` | also the \`eventData\` of events describing a person |
5022
+
5023
+ **Declaring \`detail\` while withholding \`attribution\` is the mistake to avoid.**
5024
+ An authentication event's \`eventData\` carries the email address and IP address
5025
+ that withholding attribution was meant to keep back, so the narrowing reads as a
5026
+ control while changing nothing that matters. Pair it with
5027
+ \`disclosedEventDataClasses: ["administrative"]\`.
5028
+
5029
+ The outcome reason sits in \`detail\` rather than \`context\` for the same reason,
5030
+ and it is worth understanding before you rely on either tier. It is not a field of
5031
+ its own: the application lifts it out of the event's own \`eventData\`. Most of the
5032
+ time it is a short, impersonal failure reason — but **19 event types carry a
5033
+ reason somebody typed**, including organization lifecycle changes, emergency
5034
+ access, forced password resets and retained-data access, where it is the
5035
+ operator's own words and may name anyone. Withholding an event's detail therefore
5036
+ withholds its reason too.
5037
+
5038
+ A **floor always survives** whatever you declare: event identifier, event type,
5039
+ category, severity, timestamp, organization, the acting user's identifier, source
5040
+ service, source version, source environment, and outcome. Two reasons, and only
5041
+ the first is about privacy. The event identifier is what your receiver
5042
+ de-duplicates on, and deliveries are retried — an export minimized past it
5043
+ produces duplicates in your SIEM rather than fewer records. The event type,
5044
+ severity and source version are header fields of the CEF and LEEF grammars, which
5045
+ are positional: omitting one does not shorten the record, it corrupts every field
5046
+ after it. The acting user's identifier is an opaque reference, never a name or an
5047
+ address, so it lets you correlate one actor's activity without receiving their
5048
+ identity — which is usually the trade a minimized export exists to make.
5049
+
5050
+ One capability cost to know about, because nothing warns you at the time:
5051
+ withholding \`detail\` makes OCSF exports coarser. The application refines an
5052
+ API-activity event's \`activity_id\` by reading the verb out of \`eventData\`, so
5053
+ with the object withheld a create and a delete both report the generic
5054
+ \`Other\` activity and share a \`type_uid\`. The event type is still carried in
5055
+ \`activity_name\` and \`metadata.event_code\`, so nothing is wrong — but a
5056
+ detection rule or dashboard that groups by \`type_uid\` will stop separating them.
5057
+ CEF, LEEF and structured JSON are unaffected.
5058
+
5059
+ Withheld fields are **absent**, not empty. No blank CEF custom-string slot, no
5060
+ null JSON key, no empty OCSF attribute — so a receiver's "field is present but
5061
+ empty" rule will not fire, and a rule keyed on a withheld field simply never
5062
+ matches. The same projection applies to every wire format, because it is applied
5063
+ once, before the event is signed and queued, rather than per format.
5064
+
5065
+ Omit the whole block and the destination receives the full envelope. That is the
5066
+ behaviour of every destination configured before this control existed, so
5067
+ introducing it changes nothing until you declare a narrowing.
5068
+
5069
+ Verify a narrowing the way you verify a filter: perform one controlled event,
5070
+ read the received copy, and confirm both that the withheld fields are absent and
5071
+ that the event identifier still matches the source audit record. Minimization
5072
+ does not alter the source audit trail — the full record remains in the
5073
+ application, and a narrowed feed is not evidence that less was recorded.
4966
5074
 
4967
5075
  ## Filter for purpose and volume
4968
5076