ms-tau-sdk 2.0.17.dev66__tar.gz → 2.0.18.dev68__tar.gz

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 (87) hide show
  1. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/CHANGELOG.md +70 -1
  2. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/PKG-INFO +1 -1
  3. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/pyproject.toml +1 -1
  4. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/agent_skills/tau_project_customization/SKILL.md +1 -1
  5. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/agent_skills/tau_security_and_access/SKILL.md +80 -21
  6. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/.gitignore +0 -0
  7. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/README.md +0 -0
  8. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/__init__.py +0 -0
  9. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/app.py +0 -0
  10. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/cli.py +0 -0
  11. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/config.py +0 -0
  12. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/env_file.py +0 -0
  13. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/logs.py +0 -0
  14. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/proxy.py +0 -0
  15. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/state.py +0 -0
  16. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/static/BULMA-LICENSE.txt +0 -0
  17. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/static/app.js +0 -0
  18. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/static/board.css +0 -0
  19. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/static/bulma.min.css +0 -0
  20. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/packages/tau-board/src/ms_tau_board/static/index.html +0 -0
  21. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/__init__.py +0 -0
  22. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/agent_skills/tau_a2a_runtime_adapter/SKILL.md +0 -0
  23. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/agent_skills/tau_local_development/SKILL.md +0 -0
  24. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/agent_skills/tau_repository_integration/SKILL.md +0 -0
  25. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/__init__.py +0 -0
  26. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/a2a.py +0 -0
  27. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/chat.py +0 -0
  28. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/conversations.py +0 -0
  29. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/dependencies.py +0 -0
  30. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/health.py +0 -0
  31. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/inspection.py +0 -0
  32. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/local_chat.py +0 -0
  33. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/models.py +0 -0
  34. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/request_identity.py +0 -0
  35. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/api/sessions.py +0 -0
  36. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/app.py +0 -0
  37. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/application.py +0 -0
  38. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/__init__.py +0 -0
  39. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/assertions.py +0 -0
  40. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/auth.py +0 -0
  41. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/client.py +0 -0
  42. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/local.py +0 -0
  43. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/mcp.py +0 -0
  44. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/models.py +0 -0
  45. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/routes.py +0 -0
  46. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/backend/team_memberships.py +0 -0
  47. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/cli.py +0 -0
  48. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/errors.py +0 -0
  49. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/logging.py +0 -0
  50. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/__init__.py +0 -0
  51. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/a2a_failure.py +0 -0
  52. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/a2a_message.py +0 -0
  53. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/a2a_roles.py +0 -0
  54. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/assistant_ui.py +0 -0
  55. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/chat_history.py +0 -0
  56. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/protocols/strict_json.py +0 -0
  57. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/providers/__init__.py +0 -0
  58. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/providers/definitions.py +0 -0
  59. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/providers/factory.py +0 -0
  60. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/providers/tau_compat.py +0 -0
  61. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/resources/SYSTEM.md +0 -0
  62. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/resources/__init__.py +0 -0
  63. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/resources/loader.py +0 -0
  64. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/resources/prompts/review-code-repository.md +0 -0
  65. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/__init__.py +0 -0
  66. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/deployment_health.py +0 -0
  67. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/events.py +0 -0
  68. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/extensions.py +0 -0
  69. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/failures.py +0 -0
  70. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/live_turns.py +0 -0
  71. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/manager.py +0 -0
  72. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/observability.py +0 -0
  73. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/provenance.py +0 -0
  74. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/requester.py +0 -0
  75. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/session.py +0 -0
  76. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/snapshots.py +0 -0
  77. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/runtime/task_context.py +0 -0
  78. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/sessions/__init__.py +0 -0
  79. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/sessions/storage.py +0 -0
  80. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/settings.py +0 -0
  81. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/skills.py +0 -0
  82. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/tools/__init__.py +0 -0
  83. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/tools/mainsequence_mcp.py +0 -0
  84. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/tools/mcp_applications.py +0 -0
  85. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/tools/mcp_connection.py +0 -0
  86. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/tools/skill_read.py +0 -0
  87. {ms_tau_sdk-2.0.17.dev66 → ms_tau_sdk-2.0.18.dev68}/src/ms_tau_sdk/tools/task_control.py +0 -0
@@ -1,6 +1,75 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 2.0.18 — 2026-10-18
4
+
5
+ - **The Security and access guide and the Tau security skill describe Agent policies.** The
6
+ platform now decides Agents, and the releases they run on, by the policies on them. The
7
+ [guide](docs/reference/security-model.md#agent-policies) said that sharing an Agent lets another
8
+ person use it, that everyone who can view an Agent reads all its Tasks, that an Agent editor stops
9
+ conversations and cancels Tasks, and that calling another application needs view of it. It now
10
+ says that `user` talks to the Agent and gives it Tasks, seeing only the Tasks they asked for,
11
+ `viewer` also sees every Task, `operator` also stops other people's work, `editor` also
12
+ configures it, moves it to a new runtime build, deletes it and manages its workload, and `owner`
13
+ also decides who has access; that no policy opens another person's conversation; that whoever
14
+ creates an Agent holds `owner`, Organization admins hold every action, and owners give policies
15
+ through `/api/v1/agents/<uid>/access/`; that the Agent's release follows the Agent and takes no
16
+ policy of its own; that a workload sends an Agent work with its own policy, declared under
17
+ `access.agents`, and a delegation reaches only Agents the person holds a policy on; and that
18
+ `call_release()` needs a policy on the application's release that includes
19
+ `resource-releases.invoke`. `tau_security_and_access` gains an Agents section, the public API
20
+ reference links `call_release()` to that rule, and troubleshooting and the quickstart no longer
21
+ speak of sharing an Agent. Existing shares are kept. No SDK code changes.
22
+ - **The Security and access guide and the provider guide show workflow API `3.0.0`.** The
23
+ platform's workflow API `3.0.0` replaces `2.3.0`: an `access` entry names the policy its workload
24
+ gets (`policy:`) instead of `level: view` or `level: edit`, and a workflow file of any other
25
+ version is refused before anything of it is applied, so a project switches its
26
+ `.mainsequence/workflows` files to `3.0.0` before its next push. The
27
+ [Security and access guide](docs/reference/security-model.md#secrets) and
28
+ [Named providers and sharing](docs/guides/project-configuration.md#named-providers-and-sharing)
29
+ said that `access.secrets` and `access.model_providers` give a policy for a level. They now say
30
+ that the entry names the policy, such as `policy: value_reader` for a Secret's current value or
31
+ `policy: user` for a provider, and requester access is declared in a `3.0.0` file. No SDK code
32
+ changes.
33
+ - **The provider guide, the Security and access guide and the Tau security skill describe
34
+ model-provider policies.** The platform now decides model-provider credentials and custom
35
+ endpoints by the policies on them.
36
+ [Named providers and sharing](docs/guides/project-configuration.md#named-providers-and-sharing)
37
+ said that people share a configured provider and that Organization admins need no share. It now
38
+ says that on a credential `user` selects and receives it, including in local Tau, `editor` also
39
+ refreshes, reconnects and revokes it and sees who has access, and `owner` also decides who has
40
+ access; that on a custom endpoint `user` sends requests through it and `editor` also changes and
41
+ deletes it; that the credential's person and an endpoint's creator hold `owner`; that a session
42
+ counts its owner's policies, never the Agent's workload's; that owners give policies in Command
43
+ Center or through the record's `access/` routes, and `access.model_providers` gives a workload
44
+ `user` for `level: view` and `editor` for `level: edit`; and that a refused change answers `403`
45
+ `missing_action`. The disclosure now goes with giving `user`: the holder can copy the credential,
46
+ and removing the policy does not recall copies. The
47
+ [Security and access guide](docs/reference/security-model.md#model-providers) and
48
+ `tau_security_and_access` gain a Model providers section, and the settings and troubleshooting
49
+ pages no longer speak of shares. Selection rules and existing shares are kept. No SDK code
50
+ changes.
51
+ - **The Security and access guide and the Tau security skill describe Secret policies.** The
52
+ platform now decides Secrets by the policies on them. The
53
+ [guide](docs/reference/security-model.md#secrets) and `tau_security_and_access` said that a
54
+ Secret value follows view access, that its creator cannot be removed, and that `can-view/` and
55
+ `can-edit/` list who has access. They now say that `reader` sees a Secret without its value,
56
+ `value_reader` reads the current value, `editor` also reads earlier values, sets a new value,
57
+ deletes it and sees who has access, and `owner` also decides who has access; that the creator
58
+ becomes its owner and no policy is protected; that `access.secrets` gives a workload
59
+ `value_reader` for `level: view` and `editor` for `level: edit`; and that
60
+ `GET /api/v1/secrets/<uid>/access/` and `access/me/` replace `can-view/` and `can-edit/`.
61
+ Existing shares are kept. No SDK code changes.
62
+ - **The Tau security skill describes team policies.** The platform now decides who can see and
63
+ manage a team by the policies on it. `tau_security_and_access` said that Organization admins are
64
+ protected writer members of every team and the only people who manage membership. It now says
65
+ that any person creates a team and becomes its owner and first member, that the `viewer`,
66
+ `membership_manager`, `editor` and `owner` policies decide who can see and manage it, and that
67
+ Organization admins manage every team from their role, with no membership protected. Membership
68
+ still decides who receives what is shared with a team and what `in_teams()` answers, and a team
69
+ the person only manages is not in that answer. `in_teams()` is unchanged; the
70
+ [Security and access guide](docs/reference/security-model.md#teams-and-membership) says the same.
71
+
72
+ ## 2.0.17 — 2026-10-15
4
73
 
5
74
  - **`team_uids` is removed; the verifier refuses caller assertions that list teams
6
75
  ([#103](https://github.com/mainsequence-sdk/ms-tau-sdk/issues/103), ADR 0019).** The platform no
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ms-tau-sdk
3
- Version: 2.0.17.dev66
3
+ Version: 2.0.18.dev68
4
4
  Summary: Workspace-bound Tau application primitives for Main Sequence projects
5
5
  Project-URL: Changelog, https://github.com/mainsequence-sdk/ms-tau-sdk/blob/development/CHANGELOG.md
6
6
  Project-URL: Documentation, https://github.com/mainsequence-sdk/ms-tau-sdk/tree/development/docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ms-tau-sdk"
7
- version = "2.0.17.dev66"
7
+ version = "2.0.18.dev68"
8
8
  description = "Workspace-bound Tau application primitives for Main Sequence projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -184,7 +184,7 @@ Rules for tools that act for the requester:
184
184
  a URL, and never sets `Authorization` or an `X-MainSequence-*` header.
185
185
  - A delegated call uses the person's ordinary permissions, including administrative ones; any other
186
186
  call uses the Agent's own. Each operation decides what it needs. Never infer write permission
187
- from view access.
187
+ from read access.
188
188
  - Return to the model only business results, such as rows, numbers, and names. Never return the
189
189
  response object, its headers, a token, a proof, or a raw error body.
190
190
  - Keep nothing for another turn or another person. The delegation ends with the turn, and a task
@@ -163,8 +163,9 @@ What makes it safe:
163
163
 
164
164
  - No tool takes a Secret value or a Secret name from the model. The name is built from
165
165
  `current_requester().uid`, so prompt injection cannot point the tool at another Secret.
166
- - `delegation="required"` reads the Secret as the person. The platform returns it only if the
167
- person can view it; the name is a lookup key, not the protection.
166
+ - `delegation="required"` reads the Secret as the person. The platform returns the value only if
167
+ the person holds `value_reader`, `editor` or `owner` on it; the name is a lookup key, not the
168
+ protection.
168
169
  - The value exists only inside one call. It never goes into the result, `details`, a log, an
169
170
  exception message, a file or a cache for the next turn. It travels in a header, never in a URL,
170
171
  because URLs reach logs. Errors from the outside call are caught, and the provider's raw body is
@@ -178,19 +179,19 @@ What makes it safe:
178
179
 
179
180
  A delegated read returns anything the person can view in the Agent's Environment: what they
180
181
  created and what others shared with them, directly or through a team. This holds for Secrets and
181
- other shared resources. Ordinary Teams use explicit membership: the creator is added once and
182
- can be removed; current Organization admins are protected writer members. Removing the admin
183
- role keeps membership and writer access but ends protection. Only Organization admins manage
184
- membership, and managing a workload that created a Team does not grant Team control. A Team's
185
- members still receive the resources shared with it. The Full directory remains unchanged.
186
- See the SDK Security and access guide's **Teams and membership** section for platform rollout.
187
- The platform enforces sharing; which of those objects a tool uses is part of
188
- the tool's design. For Secrets, the naming convention states that design:
182
+ other shared resources. A team's members receive what is shared with it, and `in_teams()` answers
183
+ membership. Who can see and manage a team is decided separately, by the `viewer`,
184
+ `membership_manager`, `editor` and `owner` policies on it: any person can create a team and
185
+ becomes its owner and first member, members can see the team and leave it, and Organization admins
186
+ manage every team from their role, without being members. No membership is protected. See the SDK
187
+ Security and access guide's **Teams and membership** section. The platform enforces sharing;
188
+ which of those objects a tool uses is part of the tool's design. For Secrets, the naming
189
+ convention states that design:
189
190
 
190
191
  - **A personal credential:** a name tied to the person, such as `QUOTES_API_KEY__<person uid>`.
191
192
  The person decides whether to share it.
192
- - **A team credential:** a name the team agrees on, shared with the team for view. The tool reads
193
- it for any member.
193
+ - **A team credential:** a name the team agrees on, with `value_reader` attached to the team. The
194
+ tool reads it for any member.
194
195
  - **Someone else's Secret shared with the person:** valid whenever the tool is meant to use it.
195
196
 
196
197
  Whoever can edit a Secret decides its value, so the tool uses whatever value they set. Granting or
@@ -199,13 +200,68 @@ decision people make through sharing, not one the platform makes for them.
199
200
 
200
201
  How sharing works:
201
202
 
202
- - The creator of a Secret can always view and edit it, and cannot be removed from it. People who
203
- can edit a Secret can share it, for view or for edit, with people and teams.
204
- - Most people can share only within the teams they belong to; Organization admins can share
205
- across their Organization.
206
- - `GET /api/v1/secrets/<uid>/can-view/` and `can-edit/` list the people and teams with access. A
207
- tool can use them when its design needs to, for example to refuse a team key where it expects a
208
- personal one. That is a choice of the tool, not a platform rule.
203
+ - Policies on a Secret decide access: `reader` sees that it exists and its name, never its value;
204
+ `value_reader` also reads the current value; `editor` also reads earlier values, sets a new value,
205
+ deletes it and sees who has access; `owner` also decides who has access. The creator becomes its
206
+ owner, and Organization admins hold every policy on their Organization's Secrets from their role.
207
+ - Owners attach and detach these policies for people, teams and workloads; whoever manages a
208
+ workload can also give it a policy they hold, and anyone can remove their own. No policy is
209
+ protected: an owner can remove the creator's. Nobody gives a policy with more than they hold, and
210
+ people other than Organization admins give access only to people who share an active team with
211
+ them, to teams they belong to and to workloads they can view.
212
+ - `GET /api/v1/secrets/<uid>/access/` lists who holds which policy, for editors and owners, and
213
+ `GET /api/v1/secrets/<uid>/access/me/` answers what the caller may do with it. A tool can use
214
+ them when its design needs to, for example to refuse a team key where it expects a personal one.
215
+ That is a choice of the tool, not a platform rule.
216
+
217
+ ## Model providers
218
+
219
+ The model a session runs on uses a provider credential or custom endpoint that the session owner
220
+ may use; a delegated child session uses its parent's owner. A policy that only the Agent's workload
221
+ holds does not count in a person's session. Policies on the record decide who may use it, held
222
+ directly or through a team:
223
+
224
+ - `user` uses it: a credential is selected and delivered to sessions and workloads, including local
225
+ Tau, and a custom endpoint receives their requests.
226
+ - `editor` also refreshes, reconnects or revokes a credential, or changes or deletes an endpoint,
227
+ and sees who has access; `owner` also decides who has access.
228
+ - The credential's person and the endpoint's creator hold `owner`, and Organization admins hold
229
+ every action on their Organization's records. Owners give and remove the policies in Command
230
+ Center's provider settings or through `/api/v1/model-provider-credentials/<uid>/access/` and
231
+ `/api/v1/custom-model-providers/<uid>/access/`; a refused change answers `403` `missing_action`
232
+ with the `granting_policies` that would allow it.
233
+
234
+ Holding `user` delivers the credential, or the endpoint's stored authentication, to the holder's own
235
+ runtime, including local Tau, where it can be copied; removing the policy stops later deliveries,
236
+ not copies already made. To let a team run an Agent on one credential, its owner gives the team
237
+ `user`.
238
+
239
+ ## Agents
240
+
241
+ Policies on an Agent decide who may talk to it and manage it, held directly or through a team:
242
+
243
+ - `user` talks to it and gives it Tasks, seeing only the Tasks they asked for; `viewer` also sees
244
+ every Task of the Agent with its requests and results; `operator` also stops any Task or
245
+ conversation run, other people's included; `editor` also configures it, moves it to a new runtime
246
+ build, deletes it, manages what its workload can reach and sees who has access; `owner` also
247
+ decides who has access.
248
+ - A conversation stays its owner's: no Agent policy, `owner` included, reads another person's
249
+ conversation (Organization admins can read it, never change it), and only a Task's requesters
250
+ continue it. On an Agent that acts for its requester, a Task is visible only to its requesters
251
+ and Organization admins.
252
+ - Whoever creates an Agent holds `owner`, and Organization admins hold every action on their
253
+ Organization's Agents. Owners give and remove the policies through
254
+ `/api/v1/agents/<uid>/access/`; a refused change answers `403` `missing_action` with the
255
+ `granting_policies` that would allow it, and an Agent the caller holds no policy on answers `404`.
256
+ - The release an Agent runs on takes no policy of its own: `viewer` and `operator` on the Agent see
257
+ it, and `editor` and `owner` change it.
258
+
259
+ A tool reaches Agents and their Tasks with the caller's policies: the person's in a delegated call,
260
+ the Agent's workload's otherwise. To send another Agent work without a delegation, the workload
261
+ needs its own policy on that Agent, declared under `access.agents` in its workflow file, usually
262
+ `policy: user`. Calling another application with `call_release()` needs a policy on its release
263
+ that includes calling it (`resource-releases.invoke`, which every release policy has), and the
264
+ platform checks it again on every call.
209
265
 
210
266
  ## Checking the person's teams
211
267
 
@@ -220,7 +276,9 @@ if person is None or REPORTS_TEAM_UID not in await person.in_teams([REPORTS_TEAM
220
276
  ```
221
277
 
222
278
  - `await in_teams(team_uids, *, max_age_seconds=None)` returns the subset of `team_uids` the
223
- person is an active member of, as a `frozenset`. Unknown and inactive teams are left out.
279
+ person is an active member of, as a `frozenset`. Unknown and inactive teams are left out, and so
280
+ is a team the person only manages: managing a team, also as an Organization admin, does not make
281
+ anyone a member.
224
282
  - On the turn's requester it answers only while that person is the verified caller of the request
225
283
  the turn runs in, such as a chat or A2A Message they sent. A turn with no such request raises
226
284
  `TauSDKError`: a Task attempt the platform dispatches, a turn that resumes a caller delivery, or
@@ -272,4 +330,5 @@ Patch the extension module's `current_requester` and `platform_client` with fake
272
330
  - Secret values stay inside one call, in headers, never in results, logs, errors, URLs or caches.
273
331
  - The naming convention says whose Secrets the tool uses, and the people sharing them know it.
274
332
  - A refused delegated call is reported, never retried as the Agent.
275
- - The Agent's workload holds no grants it does not need, and none on people's Secrets.
333
+ - The Agent's workload holds no grants it does not need, and none on people's Secrets; `user` is
334
+ enough on an Agent it only sends work to.