@awebai/oats 0.29.3 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/bin/oats.mjs +203 -54
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +538 -204
- package/capabilities/oats-aweb/injects/aweb.md +1 -1
- package/capabilities/oats-aweb/lib/binding-wire.mjs +31 -22
- package/capabilities/oats-aweb/oats.json +5 -12
- package/capabilities/oats-aweb/skills/VENDORED.md +4 -4
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +83 -13
- package/capabilities/oats-code-review/injects/reviewer.md +26 -0
- package/capabilities/oats-code-review/oats.json +16 -0
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +66 -0
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +30 -0
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +56 -0
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +34 -0
- package/capabilities/oats-developer/injects/developer.md +38 -0
- package/capabilities/oats-developer/oats.json +17 -0
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +43 -0
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +47 -0
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +65 -0
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +37 -0
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +36 -0
- package/capabilities/oats-engineering-expert/injects/expert.md +37 -0
- package/capabilities/oats-engineering-expert/oats.json +17 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +37 -0
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +52 -0
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +50 -0
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +53 -0
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +49 -0
- package/capabilities/oats-okf/bin/oats-okf.mjs +16 -9
- package/capabilities/oats-okf/lib/binding-wire.mjs +47 -15
- package/capabilities/oats-okf/lib/config.mjs +2 -1
- package/capabilities/oats-okf/lib/consult.mjs +26 -4
- package/capabilities/oats-okf/lib/harvest-switch.mjs +16 -3
- package/capabilities/oats-okf/lib/inspection.mjs +26 -7
- package/capabilities/oats-okf/lib/io.mjs +9 -1
- package/capabilities/oats-okf/lib/sources.mjs +34 -3
- package/capabilities/oats-okf/lib/stores.mjs +8 -6
- package/capabilities/oats-okf/lib/worker.mjs +7 -17
- package/capabilities/oats-okf/oats.json +6 -3
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +2 -2
- package/capabilities/oats-okf-harvest/oats.json +3 -3
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +6 -6
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +37 -16
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +1 -1
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +6 -1
- package/capabilities/oats-okf-maintenance/oats.json +2 -2
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +17 -2
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +11 -23
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +26 -0
- package/capabilities/oats-workspace-experts/oats.json +9 -0
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +7 -10
- package/docs/configuration.md +213 -64
- package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
- package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
- package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
- package/docs/design/2026-09-27-team-model-v2.md +116 -0
- package/docs/design/2026-09-28-automations-trust.md +38 -0
- package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
- package/docs/design/HISTORY.md +65 -0
- package/docs/design/README.md +23 -54
- package/docs/desktop-cli-api.md +1787 -1777
- package/docs/desktop.md +30 -91
- package/docs/execution-targets.md +146 -292
- package/docs/first-team.md +31 -17
- package/docs/implementation.md +76 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +61 -0
- package/docs/release-lane.md +77 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.29.4.md +90 -0
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/schedules.md +280 -349
- package/docs/servers.md +99 -117
- package/docs/soul.schema.json +2 -9
- package/docs/souls-and-instances.md +145 -158
- package/docs/workspaces.md +132 -215
- package/lib/automations.mjs +28 -6
- package/lib/core.mjs +226 -74
- package/lib/instance-events.mjs +1 -1
- package/lib/instance-inspect.mjs +109 -34
- package/lib/instance-lifecycle.mjs +14 -1
- package/lib/instance-resolution.mjs +26 -27
- package/lib/launch-preference.mjs +87 -0
- package/lib/materialize.mjs +3 -3
- package/lib/packages.mjs +2 -5
- package/lib/resolve.mjs +29 -87
- package/lib/schedule.mjs +32 -18
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +53 -17
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +9 -15
- package/package.json +1 -1
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-review
|
|
3
|
-
description: General code review discipline for reviewing a diff or commit range — correctness, design, readability, tests, and API surface, with severity-ranked, actionable findings. Use when asked to review code changes, a commit, a diff, or a PR for quality.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Code review
|
|
7
|
-
|
|
8
|
-
Review the CHANGE, not the codebase. The standard (from Google's engineering
|
|
9
|
-
practices): approve when the change **improves overall code health**, even if
|
|
10
|
-
imperfect — demand blockers, suggest the rest.
|
|
11
|
-
|
|
12
|
-
## Pass order (read the diff twice)
|
|
13
|
-
|
|
14
|
-
**Pass 1 — does it work?**
|
|
15
|
-
- Correctness: logic errors, off-by-one, inverted conditions, wrong operator.
|
|
16
|
-
- Edge cases: empty/null/undefined inputs, zero/negative counts, unicode,
|
|
17
|
-
concurrent access, timeouts, partial failure mid-operation.
|
|
18
|
-
- Error handling: swallowed exceptions, missing cleanup on the error path,
|
|
19
|
-
errors that lie about the cause. Every catch must justify itself.
|
|
20
|
-
- State: mutation of shared state, stale caches, ordering assumptions.
|
|
21
|
-
- Resource lifecycle: files/handles/processes/listeners opened but not closed.
|
|
22
|
-
|
|
23
|
-
**Pass 2 — should it be this way?**
|
|
24
|
-
- Design: is this the simplest change that solves the problem? Flag
|
|
25
|
-
speculative generality and dead configurability.
|
|
26
|
-
- Consistency: does it follow the codebase's existing patterns, naming, and
|
|
27
|
-
error conventions? (Local consistency beats personal preference.)
|
|
28
|
-
- Readability: could a maintainer six months from now follow it without the
|
|
29
|
-
PR description? Names carry meaning; comments explain WHY, not what.
|
|
30
|
-
- API surface: new exports/flags/config keys are forever — are they earned?
|
|
31
|
-
- Tests: does the change carry tests that would FAIL if the logic regressed?
|
|
32
|
-
Tests that mirror the implementation instead of the behavior are findings.
|
|
33
|
-
- Performance: only flag measurable problems (N+1, unbounded growth,
|
|
34
|
-
sync-blocking hot paths) — not micro-optimizations.
|
|
35
|
-
|
|
36
|
-
## Reporting
|
|
37
|
-
|
|
38
|
-
- Verdict: `APPROVE` / `APPROVE WITH NITS` / `NEEDS CHANGES`.
|
|
39
|
-
- Each finding: `severity — file:line — what + why + concrete fix`.
|
|
40
|
-
Severities: **blocker** (wrong/unsafe/regression), **important** (should
|
|
41
|
-
fix before merge), **nit** (better, not required — prefix "Nit:").
|
|
42
|
-
- Ask questions where intent is unclear instead of asserting a fault.
|
|
43
|
-
- Do not pad: no restating the diff, no praise quotas, no style opinions a
|
|
44
|
-
formatter could hold. If it's clean, say APPROVE and one line why.
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: security-review
|
|
3
|
-
description: Security-focused review of a diff or commit range — injection, secrets, trust boundaries, authz, unsafe deserialization, supply chain, and path/command safety, ranked by exploitability. Use when asked to security-review changes or as the second pass of a full review.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Security review
|
|
7
|
-
|
|
8
|
-
Review the change as an attacker would read it: every new input is hostile,
|
|
9
|
-
every boundary crossing is an opportunity. Grounded in the OWASP code-review
|
|
10
|
-
model — findings ranked by exploitability, not by pattern-match count.
|
|
11
|
-
|
|
12
|
-
## Checklist by trust boundary
|
|
13
|
-
|
|
14
|
-
**Inputs (anything the process didn't create itself)**
|
|
15
|
-
- Command injection: user/config/network data reaching `exec`/`spawn`/shell
|
|
16
|
-
strings. Quoting is not escaping; prefer argv arrays. Flag every
|
|
17
|
-
interpolated shell string that carries external data.
|
|
18
|
-
- Path traversal: joins with external segments (`../`), symlink following,
|
|
19
|
-
zip-slip in extraction. Require canonicalize-then-prefix-check.
|
|
20
|
-
- Injection into interpreters: SQL/NoSQL/LDAP/regex/eval/Function/template
|
|
21
|
-
engines fed external strings.
|
|
22
|
-
- Deserialization: YAML/JSON/pickle-style loads of untrusted bytes with
|
|
23
|
-
type resolution or object construction.
|
|
24
|
-
- SSRF: URLs from outside fetched by the server; check scheme/host pinning.
|
|
25
|
-
|
|
26
|
-
**Secrets & data**
|
|
27
|
-
- Hardcoded credentials, tokens, private keys — including in tests, fixtures,
|
|
28
|
-
and example configs. Entropy-looking strings deserve a question.
|
|
29
|
-
- Secrets in logs, error messages, process args (visible in `ps`), URLs.
|
|
30
|
-
- New persistence of sensitive data: is it needed, is it protected, is it
|
|
31
|
-
cleaned up on retire/delete paths?
|
|
32
|
-
|
|
33
|
-
**AuthN/AuthZ**
|
|
34
|
-
- New endpoints/commands/IPC surfaces: who can reach them, and what do they
|
|
35
|
-
authorize against? "Bound to localhost" is a real but WEAK boundary — note
|
|
36
|
-
what a local malicious process could do.
|
|
37
|
-
- Privilege boundaries: does the change let low-trust config/data cause
|
|
38
|
-
high-trust execution (hooks, plugins, migrations, CI)?
|
|
39
|
-
- TOCTOU: check-then-use on files/permissions/state.
|
|
40
|
-
|
|
41
|
-
**Supply chain & execution**
|
|
42
|
-
- New dependencies: are they necessary, pinned, and from expected owners?
|
|
43
|
-
- Downloaded/cloned artifacts: integrity-checked before execution?
|
|
44
|
-
- Anything that writes then executes (temp scripts, curl|sh patterns).
|
|
45
|
-
|
|
46
|
-
**Web-facing (when applicable)**
|
|
47
|
-
- XSS: external strings reaching innerHTML/attributes without escaping.
|
|
48
|
-
- CSRF on state-changing endpoints; CORS wildcards; missing content-type
|
|
49
|
-
discipline on APIs.
|
|
50
|
-
|
|
51
|
-
## Reporting
|
|
52
|
-
|
|
53
|
-
- Verdict shares the scale: `APPROVE` / `APPROVE WITH NITS` / `NEEDS CHANGES`
|
|
54
|
-
— any credible injection/secret/authz finding is a **blocker**.
|
|
55
|
-
- Each finding: `severity — file:line — attack scenario in one sentence +
|
|
56
|
-
concrete fix`. If you cannot articulate the attack, downgrade to a
|
|
57
|
-
question rather than inventing a threat.
|
|
58
|
-
- Distinguish "exploitable now" from "hardening" — both are reportable,
|
|
59
|
-
only the first blocks.
|
package/docs/conventions.md
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# Conventions — canonical files and generated views
|
|
2
|
-
|
|
3
|
-
OATS uses one canonical source for durable soul content and generated,
|
|
4
|
-
instance-local views for deployment composition.
|
|
5
|
-
|
|
6
|
-
## Operating documents
|
|
7
|
-
|
|
8
|
-
```text
|
|
9
|
-
souls/<name>/AGENTS.md # canonical role instructions (in the member repo)
|
|
10
|
-
souls/<name>/CLAUDE.md -> AGENTS.md
|
|
11
|
-
instance/AGENTS.md # generated regular file
|
|
12
|
-
instance/CLAUDE.md -> AGENTS.md
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Never maintain an independent soul `CLAUDE.md`. Config-dependent capability,
|
|
16
|
-
work-mode, and workspace instructions belong only in generated instance
|
|
17
|
-
`AGENTS.md`; they must not be reconciled into the committed soul.
|
|
18
|
-
|
|
19
|
-
Generated blocks use `<!-- oats:<source> src=<file> -->` markers for
|
|
20
|
-
provenance. Edit the canonical soul, source file, or target binding, then spawn
|
|
21
|
-
a new instance. `oats doctor --soul <name>` previews the same final composition.
|
|
22
|
-
|
|
23
|
-
## Skills
|
|
24
|
-
|
|
25
|
-
The only OATS-managed runtime skill root is the instance:
|
|
26
|
-
|
|
27
|
-
```text
|
|
28
|
-
instance/.agents/skills/ # canonical exact set
|
|
29
|
-
instance/.claude/skills -> ../.agents/skills
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Spawn copies kernel + soul-private + active capability skills into real
|
|
33
|
-
instance-local directories there. Directory symlinks are not used because
|
|
34
|
-
harness recursive discovery may not descend through them. Under the workspace
|
|
35
|
-
model (0.25) every capability is copied whole into
|
|
36
|
-
`instance/.oats/modules/<capability>/` and its skills into
|
|
37
|
-
`instance/.agents/skills/<capability>/<skill>/`; nothing is installed at a
|
|
38
|
-
config level. Config-level `.agents/skills` is not an OATS capability source
|
|
39
|
-
or an ambient runtime discovery root.
|
|
40
|
-
|
|
41
|
-
Harnesses start normally (workspace-model decision 13, and the behaviour of
|
|
42
|
-
every launch a 0.25 kernel performs, classic homes included): Pi starts with
|
|
43
|
-
cwd = the instance home, the composed `AGENTS.md` appended to its system
|
|
44
|
-
prompt, and its own skill, context and extension discovery intact — the
|
|
45
|
-
instance's copied skills are found because they sit under cwd; machine-level
|
|
46
|
-
and repo-level skills resolve exactly as without OATS. *(0.24 kernels started
|
|
47
|
-
Pi with ambient skill and context discovery disabled and the one instance path
|
|
48
|
-
explicit; that exclusion is gone.)* Claude runs provider-native: it reads the
|
|
49
|
-
instance's `.claude/skills` and `CLAUDE.md` symlinks, and the operator's own
|
|
50
|
-
user and project configuration — skills, plugins, settings — stays in effect.
|
|
51
|
-
Neither harness gets a redirected config home.
|
|
52
|
-
`composition.materialized.harnessPosture` in `instance.json` records what each
|
|
53
|
-
instance actually exposes. `oats-getting-started` is the sole pre-workspace
|
|
54
|
-
ambient bootstrap.
|
|
55
|
-
|
|
56
|
-
Duplicate skill directory names within the OATS-composed set are errors
|
|
57
|
-
(`E_SKILL_DUPLICATE`, naming both capabilities) unless the classic config's
|
|
58
|
-
`skill-overrides` selects a source; between a composed skill and an ambient
|
|
59
|
-
repo/machine skill the harness's own precedence decides (decision 16).
|
|
60
|
-
|
|
61
|
-
## Package locations
|
|
62
|
-
|
|
63
|
-
**Workspace model (0.25, current):** nothing is installed. A capability lives
|
|
64
|
-
where its owner keeps it and is copied whole into each instance at spawn:
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
<member repo>/capabilities/<name>/oats.json # member-tier capability, latest state (membership is the trust)
|
|
68
|
-
<package repo>/oats-package/oats-package.json # package-tier: versioned via oats-workspace.yaml packages:
|
|
69
|
-
<deployment>/oats-lock.json # lockfileVersion 3: package commit and integrity
|
|
70
|
-
<instance>/.oats/modules/<capability>/ # the copy this instance runs
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Quick map
|
|
74
|
-
|
|
75
|
-
| Thing | Canonical location |
|
|
76
|
-
|---|---|
|
|
77
|
-
| Shared declaration | `oats-workspace.yaml` in the host repo; `oats-membership.yaml` in every member |
|
|
78
|
-
| Per-machine config | `<deployment>/oats-local.yaml` (uncommitted) |
|
|
79
|
-
| Acquisition lock | `<deployment>/oats-lock.json` (v3) |
|
|
80
|
-
| Soul source | `<member repo>/souls/<name>/` |
|
|
81
|
-
| Soul operating doc | `souls/<name>/AGENTS.md` |
|
|
82
|
-
| Soul Claude view | `souls/<name>/CLAUDE.md -> AGENTS.md` |
|
|
83
|
-
| Soul-private skills | `souls/<name>/skills/` |
|
|
84
|
-
| Instance operating doc | `instance/AGENTS.md` (generated) |
|
|
85
|
-
| Instance skill set | `instance/.agents/skills/` |
|
|
86
|
-
| Instance modules | `instance/.oats/modules/<capability>/` |
|
|
87
|
-
| Instance metadata | `instance/instance.json` (`modules{}`, `providers{}`, `workspace{}`) |
|
|
88
|
-
|
|
89
|
-
Symlinks prevent compatibility paths from drifting. Generated regular files
|
|
90
|
-
separate canonical portable identity from scope-dependent runtime policy.
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# Architecture reassessment: usable agents with replaceable services
|
|
2
|
-
|
|
3
|
-
Assessment of main `76c0ea4`, September 7, 2026. Requested by Juan after
|
|
4
|
-
operating the Desktop; incorporates Pepe's terminal, shortcut, split and soul
|
|
5
|
-
management feedback. This records the direction and implementation gaps, not a
|
|
6
|
-
claim that every item below has shipped.
|
|
7
|
-
|
|
8
|
-
The requirements authority for this assessment is Juan's September 3
|
|
9
|
-
“Architecture simplification and generlization” in his OATS project KB:
|
|
10
|
-
souls carry instructions and capabilities; a harvester converts ephemeral
|
|
11
|
-
state into knowledge accessible through the selected knowledge capability;
|
|
12
|
-
packages distribute souls and capabilities; OATS constructs and operates
|
|
13
|
-
instances across runtimes and platforms. The private Bookshelf README points
|
|
14
|
-
to September 1's adoption/sovereignty strategy. Its relevant constraint is that
|
|
15
|
-
changing a runtime or service provider must not erase the team's relationships
|
|
16
|
-
or working knowledge. The older August proposals about genomes, clothes and
|
|
17
|
-
turn-record experiments are background, not reasons to expand this release.
|
|
18
|
-
|
|
19
|
-
## Decision
|
|
20
|
-
|
|
21
|
-
Keep the existing package and capability-layer mechanism. Correct the places
|
|
22
|
-
where the CLI and GUI bypass it. The architecture is broadly right; the
|
|
23
|
-
operator experience and some service boundaries are incomplete. More
|
|
24
|
-
abstractions will not fix a terminal that cannot accept a screenshot.
|
|
25
|
-
|
|
26
|
-
| Component | Owns | Must not assume |
|
|
27
|
-
|---|---|---|
|
|
28
|
-
| OATS kernel | Soul/instance construction, configuration, lifecycle, host placement, scheduling, capability resolution | A particular knowledge provider, messaging service, or GUI |
|
|
29
|
-
| Session backend | Durable terminal, attach/detach, resize, literal input, observation | OATS soul/package semantics or task success |
|
|
30
|
-
| Knowledge capability | Knowledge access and representation; its harvester and promotion policy | Every installation uses OKF or stores memory in the same files |
|
|
31
|
-
| Messaging capability / aweb | Durable messages, identities, event subscriptions and delivery policy | A particular model harness or an open Desktop window |
|
|
32
|
-
| Task capability | Durable work and task semantics | A particular terminal backend |
|
|
33
|
-
| Desktop | Inspect effective configuration; explicit operator actions; terminal input, files, layout | Provider names, SSH commands, or a second lifecycle implementation |
|
|
34
|
-
|
|
35
|
-
Scheduling belongs to OATS, and a scheduled harvest is one use of scheduling.
|
|
36
|
-
Harvesting behavior belongs to the knowledge capability. Starting an agent,
|
|
37
|
-
writing a prompt, and producing reviewed knowledge are different outcomes.
|
|
38
|
-
The UI must retain those distinctions.
|
|
39
|
-
|
|
40
|
-
## What already fits, and what does not
|
|
41
|
-
|
|
42
|
-
`lib/core.mjs` already selects exclusive knowledge/messaging/tasks layers by
|
|
43
|
-
manifest, resolves scoped capability settings, dispatches lifecycle hooks, and
|
|
44
|
-
materializes runtime instructions. Jira and Linear demonstrate that a layer
|
|
45
|
-
can have alternative implementations. OKF's harvester is already an exported
|
|
46
|
-
capability agent. There is no reason to replace this machinery.
|
|
47
|
-
|
|
48
|
-
The remaining coupling is concrete:
|
|
49
|
-
|
|
50
|
-
- The retire receipt reads `hookResults.meta["oats.okf"].harvested`, although
|
|
51
|
-
current OKF does not supply a retire hook. Remove the dead provider-specific
|
|
52
|
-
inference; do not invent successful harvesting at retirement.
|
|
53
|
-
- Remote capability routing recognizes `okf harvest` specifically in
|
|
54
|
-
`bin/oats.mjs` and `lib/servers.mjs`.
|
|
55
|
-
- Desktop harvest actions and scheduled-harvest definitions construct
|
|
56
|
-
`oats okf harvest`; the editor recognizes that exact argv.
|
|
57
|
-
- The “brain” view presents `STATE.md`, `log.md` and `notes/` as universal
|
|
58
|
-
knowledge structure. These are conventions of the current setup.
|
|
59
|
-
|
|
60
|
-
The next service contract should expose the **effective knowledge provider and
|
|
61
|
-
its supported operations for a specific soul/home**. Discovering a capability
|
|
62
|
-
command namespace alone is insufficient: it does not promise a `harvest` verb
|
|
63
|
-
or a shared file layout. A provider may offer harvest, different operations,
|
|
64
|
-
or read-only access. Desktop must show only declared operations and route
|
|
65
|
-
execution through the selected CLI capability. The same resolution must apply
|
|
66
|
-
locally, remotely, and when a scheduled operation runs.
|
|
67
|
-
|
|
68
|
-
Keep that change small: explicit operation metadata, scoped discovery, and one
|
|
69
|
-
invocation route using the existing capability engine. Do not add a plugin
|
|
70
|
-
framework, generic workflow language, or a second knowledge store. Demonstrate
|
|
71
|
-
replaceability with a tiny alternative-provider fixture that uses a different
|
|
72
|
-
command and storage layout; a full second product is unnecessary.
|
|
73
|
-
|
|
74
|
-
## tmux and Herdr
|
|
75
|
-
|
|
76
|
-
The current kernel defaults to a shared tmux session (`pi-agents`) with a
|
|
77
|
-
window per instance. An agent does not require another tmux server. The GUI
|
|
78
|
-
creates a temporary session linking only the selected window. That isolates
|
|
79
|
-
viewers: switching a terminal elsewhere cannot redirect a GUI tab to another
|
|
80
|
-
agent, and an agent exiting cannot silently expose a sibling under its label.
|
|
81
|
-
The `oatsdesk-*` name in Juan's screenshot is this viewer. Its status bar can
|
|
82
|
-
be hidden with a viewer-local setting. Do not alter global tmux settings or
|
|
83
|
-
merge/move live agent sessions to solve a display defect.
|
|
84
|
-
|
|
85
|
-
Herdr 0.8.2 is a separate terminal runtime, not a tmux-compatible superset.
|
|
86
|
-
Its documented direct terminal attachment, socket API, events and SSH support
|
|
87
|
-
are useful. Its semantic agent state comes from detection and/or integrations;
|
|
88
|
-
it is richer evidence, not proof that a particular message was consumed.
|
|
89
|
-
The [socket API](https://herdr.dev/docs/socket-api/) explicitly distinguishes
|
|
90
|
-
agent-state waits from arbitrary command completion. The
|
|
91
|
-
[remote documentation](https://herdr.dev/docs/persistence-remote/) also
|
|
92
|
-
separates a local thin client from running a client entirely on the server;
|
|
93
|
-
only the former can directly bridge the local desktop clipboard.
|
|
94
|
-
|
|
95
|
-
Keep one OATS session contract and both existing adapters for now. Do not add
|
|
96
|
-
another supervisor above them. Qualify Herdr's actual literal multi-line
|
|
97
|
-
input, exact occupant checks, detach, resize, process exit and remote behavior
|
|
98
|
-
before selecting it as the default for new instances. Inspect `pane run`
|
|
99
|
-
implementation before replacing it merely because its name sounds like shell
|
|
100
|
-
execution. Removing tmux is a later deployment choice, not a prerequisite for
|
|
101
|
-
consistent UI or remote agents. Existing tmux agents stay where they are.
|
|
102
|
-
|
|
103
|
-
## Desktop correction sequence
|
|
104
|
-
|
|
105
|
-
1. **Terminal essentials.** Hide viewer chrome, accept dropped files and pasted
|
|
106
|
-
images without pressing Enter, upload remote files to the execution host,
|
|
107
|
-
preserve the destination tab across async work, and show transfer failures.
|
|
108
|
-
Keep a single GUI and bounded viewers. This is the immediate implementation.
|
|
109
|
-
2. **Keyboard and splits.** Restore Ctrl+Tab navigation inside Mac terminals;
|
|
110
|
-
let an already-open terminal fill an empty split without a second attach;
|
|
111
|
-
expose draggable and keyboard-operable separators. Follow up specific
|
|
112
|
-
keyboard reports with real input tests, especially terminal editing keys
|
|
113
|
-
and non-US layouts. App shortcuts must not silently steal terminal edits.
|
|
114
|
-
3. **Souls & capabilities.** Replace the launch-centric roster with a management
|
|
115
|
-
surface showing souls, installed capabilities, effective layer providers,
|
|
116
|
-
source/version, scoped activation and runtime defaults. Inspect and launch
|
|
117
|
-
are distinct actions. Edits use existing CLI operations with the exact scope
|
|
118
|
-
visible; installing a capability must not silently activate it. This is not
|
|
119
|
-
a marketplace or Team Builder project.
|
|
120
|
-
4. **Provider-neutral operations.** Introduce the scoped operation contract
|
|
121
|
-
above, then use it for manual harvest, schedules and knowledge inspection.
|
|
122
|
-
No second hardcoded default is accepted as a generalization.
|
|
123
|
-
5. **Operating rollout.** Enable schedules per team with the owner's learning
|
|
124
|
-
policy. Capture-lock recovery is a separate reliability issue affecting
|
|
125
|
-
unattended harvesting; it does not block arbitrary scheduled wakes.
|
|
126
|
-
|
|
127
|
-
Acceptance must include real Electron file objects, actual terminal bytes,
|
|
128
|
-
remote transfer hashes, split focus/resize without extra PTYs, and a provider
|
|
129
|
-
replacement fixture. Unit tests of mocked argv alone do not establish these
|
|
130
|
-
boundaries. Reuse the existing agents and GUI sparingly; no model is needed to
|
|
131
|
-
exercise attachment transport or terminal layout.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Souls and capabilities in Desktop
|
|
2
|
-
|
|
3
|
-
Selecting a soul opens its details. Launch and Schedule are explicit actions;
|
|
4
|
-
Quick Open and Enter inspect instead of launching. The existing local Files
|
|
5
|
-
browser remains available. It is separate from provider knowledge inspection.
|
|
6
|
-
|
|
7
|
-
The inspector reads the kernel's `oats inspect --json` answer on selection,
|
|
8
|
-
Refresh, or after an explicit mutation. The roster's eight-second poll never
|
|
9
|
-
rescans capabilities or replaces an editor. Workspace changes invalidate old
|
|
10
|
-
responses. Same-named souls are addressed by name plus agents root; instances
|
|
11
|
-
are addressed by their exact home.
|
|
12
|
-
|
|
13
|
-
The Capabilities button inspects workspace defaults, with a member-scope
|
|
14
|
-
selector where a workspace contains several roots. Installed version, source
|
|
15
|
-
and health are separate from effective activation, provenance and settings.
|
|
16
|
-
Enable, explicit disable and return to inheritance call `oats use`; layer-wide
|
|
17
|
-
disable is distinct from excluding a single capability, and is available only
|
|
18
|
-
when inspecting a workspace or member scope, never an individual soul. These changes apply to
|
|
19
|
-
future instances. Existing homes retain their captured bindings and settings.
|
|
20
|
-
|
|
21
|
-
Authored souls expose only the fields the kernel reports as editable. Desktop
|
|
22
|
-
edits runtime, model, backend, YOLO, description and instructions through
|
|
23
|
-
`oats soul set`. Packaged souls remain read-only and explain where their source
|
|
24
|
-
must be changed. Instructions use a private temporary file; the CLI owns remote
|
|
25
|
-
transfer and mutation. Desktop does not modify YAML or resolve capabilities.
|
|
26
|
-
|
|
27
|
-
An instance's action menu opens Knowledge & capabilities. The kernel supplies
|
|
28
|
-
its snapshot, differences from current configuration, and declared provider
|
|
29
|
-
operations. View operations return labeled documents; Desktop renders their
|
|
30
|
-
text and treats remote paths as provenance, never as local files to open. Actions
|
|
31
|
-
without required arguments can run here. Operations requiring arguments explain
|
|
32
|
-
that they need the CLI. No provider is assumed to support harvesting.
|
|
33
|
-
|
|
34
|
-
Schedules store an operation address and exact home with the kernel's generic
|
|
35
|
-
`operation` job kind. The form discovers declared, available actions on demand.
|
|
36
|
-
The server verifies that declaration again at save time, and the kernel resolves
|
|
37
|
-
and validates the provider at execution time. Existing command schedules remain
|
|
38
|
-
visible and runnable, but the GUI does not reverse-parse their argv to edit them.
|
|
39
|
-
|
|
40
|
-
Every capability request requires an exact advertised workspace. Remote requests
|
|
41
|
-
require its saved server registration and the CLI's operations API feature; all
|
|
42
|
-
routing stays in OATS. The consumer never performs SSH or silently substitutes a
|
|
43
|
-
local workspace. The proxy allows the CLI's bounded operation to return its
|
|
44
|
-
receipt before timing out.
|
|
45
|
-
|
|
46
|
-
Validation: scope/identity and remote-route refusal; private instructions and
|
|
47
|
-
failure cleanup; declared schedule actions; stale inspection/save responses;
|
|
48
|
-
provider text rendering; explicit launch and existing runtime flows. Native
|
|
49
|
-
Electron rendering is checked with a temporary fixture frame in the existing
|
|
50
|
-
GUI, without starting a model, agent, or another application instance.
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
# Proposal: manage server agents from an iPhone
|
|
2
|
-
|
|
3
|
-
Status: proposed, September 7, 2026. Requested by Juan following a feasibility
|
|
4
|
-
assessment. This document authorizes no implementation, deployment, or changes
|
|
5
|
-
to running teams. Recommendations below are not shipped functionality.
|
|
6
|
-
|
|
7
|
-
## Purpose and recommendation
|
|
8
|
-
|
|
9
|
-
Let an operator manage OATS agents on a server and talk to them from an iPhone.
|
|
10
|
-
Agents keep working when the phone is locked, disconnected, or switched off.
|
|
11
|
-
Screenshots and files are part of the first useful experience.
|
|
12
|
-
|
|
13
|
-
Start with one server reached privately through Tailscale and a mobile web app
|
|
14
|
-
that can be installed on the iPhone Home Screen. Build on the existing OATS
|
|
15
|
-
control and session contracts. A native iPhone app can consume the same service
|
|
16
|
-
later if sharing, voice, notifications, or other native integration justify it.
|
|
17
|
-
|
|
18
|
-
The substantial work is making the client/server boundary explicit and making
|
|
19
|
-
conversation delivery reliable. A narrow management and terminal client is
|
|
20
|
-
feasible without rewriting the kernel. A polished conversation experience is
|
|
21
|
-
more than embedding the Desktop terminal in a small screen.
|
|
22
|
-
|
|
23
|
-
This extends the [architecture reassessment](2026-09-07-architecture-reassessment.md)
|
|
24
|
-
and its interpretation of Juan's KB direction: standard components with clear
|
|
25
|
-
contracts, replaceable service providers, and preserved identity and knowledge
|
|
26
|
-
across runtime changes. It does not supersede those contracts.
|
|
27
|
-
|
|
28
|
-
## What exists and what is missing
|
|
29
|
-
|
|
30
|
-
Assessment baseline: source main `d20f082`, with Desktop behavior inspected in
|
|
31
|
-
the lead worktree containing that main. These are reusable pieces, not a claim
|
|
32
|
-
that a remote mobile API already exists.
|
|
33
|
-
|
|
34
|
-
| Area | Existing basis | Work needed for mobile |
|
|
35
|
-
| --- | --- | --- |
|
|
36
|
-
| Lifecycle and configuration | CLI-backed roster, spawn/start, model choices, retirement and schedule operations | Authenticated network access with exact target selection and truthful results |
|
|
37
|
-
| Terminal access | Session adapters, HTTP pane capture/input, Electron PTY attachment | Network streaming, resize, reconnect and bounded viewer lifetime outside Electron |
|
|
38
|
-
| Attachments | Desktop file/image ingestion and execution-host upload | Browser or native file selection, authenticated upload and visible transfer state |
|
|
39
|
-
| Provider operations | Scoped inspection and declared capability operations | Reuse the same discovery and invocation routes in mobile views |
|
|
40
|
-
| Conversations | aweb is the intended owner of durable identity, messages and delivery | Qualify the human/agent conversation, reply and replay contracts before promising chat |
|
|
41
|
-
| Background operation | Durable agent sessions and OATS scheduling mechanisms | Qualify service, scheduler and message wake operation with every GUI closed |
|
|
42
|
-
|
|
43
|
-
The current [Desktop HTTP backend](../../packages/desktop/server/oats-web.mjs)
|
|
44
|
-
binds to loopback and checks local Host/Origin values. It assumes a trusted
|
|
45
|
-
local client; it is not an authenticated remote service. Live terminal data,
|
|
46
|
-
resize and attachment calls currently cross
|
|
47
|
-
[Electron IPC](../../packages/desktop/main.mjs). Exposing the current port
|
|
48
|
-
unchanged or running Electron headlessly would not complete the required work.
|
|
49
|
-
|
|
50
|
-
## Architecture and ownership
|
|
51
|
-
|
|
52
|
-
```mermaid
|
|
53
|
-
flowchart TD
|
|
54
|
-
Phone[iPhone: mobile web or native client] -->|HTTPS over Tailscale| Service[OATS host control service]
|
|
55
|
-
Desktop[Desktop client] -->|Shared control contracts| Service
|
|
56
|
-
Service --> Kernel[Existing OATS CLI and kernel]
|
|
57
|
-
Kernel --> Sessions[Session adapters: tmux or Herdr]
|
|
58
|
-
Service --> Messaging[Selected messaging provider: aweb initially]
|
|
59
|
-
Kernel --> Providers[Selected knowledge and task capabilities]
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
The service is a proposed independently runnable form of the existing control
|
|
63
|
-
backend, with the necessary terminal transport moved out of Electron. It
|
|
64
|
-
delegates lifecycle mutations to the supported OATS CLI. Desktop adoption can
|
|
65
|
-
be incremental; mobile must not introduce a second lifecycle implementation.
|
|
66
|
-
|
|
67
|
-
| Component | Responsibility |
|
|
68
|
-
| --- | --- |
|
|
69
|
-
| OATS kernel | Construction, lifecycle, runtime/model configuration, host placement, schedules and capability resolution |
|
|
70
|
-
| Host control service | Authenticated client access, scoped command dispatch, bounded live observations, attachments and terminal viewers |
|
|
71
|
-
| Session backend | Durable execution, attach/detach, literal input, resize and terminal observation |
|
|
72
|
-
| Messaging provider | Durable identity, conversations, events, delivery and any missing human/agent messaging semantics |
|
|
73
|
-
| Knowledge provider | Knowledge representation, access, harvest and promotion policy |
|
|
74
|
-
| Phone and Desktop | Operator interaction and presentation of the same contracts |
|
|
75
|
-
|
|
76
|
-
Use one control service for the selected deployment on a host, not a process
|
|
77
|
-
per agent or client. Existing schedulers and message wake mechanisms remain
|
|
78
|
-
responsible for their work; do not build another scheduler or wake broker in
|
|
79
|
-
the mobile client. Share bounded subscriptions and roster refreshes where
|
|
80
|
-
possible. Open terminal viewers only when needed, apply output backpressure,
|
|
81
|
-
and detach abandoned viewers without stopping agents.
|
|
82
|
-
|
|
83
|
-
tmux and Herdr remain interchangeable session adapters. Mobile access does not
|
|
84
|
-
require a Herdr migration. Start with a direct connection to one execution
|
|
85
|
-
host; later add saved server endpoints or reuse OATS registered-host routing.
|
|
86
|
-
SSH credentials for routed hosts stay on the routing server, not the phone.
|
|
87
|
-
|
|
88
|
-
## Private access through Tailscale
|
|
89
|
-
|
|
90
|
-
Install the ordinary Tailscale app on the iPhone and connect the server to the
|
|
91
|
-
same tailnet. Use Tailscale Serve to proxy the loopback service over HTTPS,
|
|
92
|
-
accessible only through the tailnet's access rules. No embedded VPN or public
|
|
93
|
-
Funnel endpoint is needed. This is a proposed deployment choice, not a current
|
|
94
|
-
OATS installation instruction. [Tailscale Serve documentation](https://tailscale.com/docs/features/tailscale-serve)
|
|
95
|
-
|
|
96
|
-
Network membership must map to an explicit authorized operator. For an initial
|
|
97
|
-
single-owner deployment, choose a simple revocable application session or
|
|
98
|
-
validated Tailscale identity; do not add a second account platform. If trusting
|
|
99
|
-
Serve's identity headers, keep the backend reachable only through the trusted
|
|
100
|
-
local proxy path and follow its header-handling requirements. Configure the
|
|
101
|
-
actual HTTPS Host/Origin rather than removing the existing checks.
|
|
102
|
-
[Tailscale identity headers](https://tailscale.com/docs/features/tailscale-serve#identity-headers)
|
|
103
|
-
|
|
104
|
-
Authorize every action, terminal attachment and upload against a registered
|
|
105
|
-
workspace and exact instance home. Keep runtime permission settings such as
|
|
106
|
-
`yolo` separate from who may control the agent. Exclude multi-tenant hosting
|
|
107
|
-
and elaborate permissions administration from the first version.
|
|
108
|
-
|
|
109
|
-
## Phone experience
|
|
110
|
-
|
|
111
|
-
The primary screen lists workspaces and their agents, with readable names and
|
|
112
|
-
running, stopped, needs-input or unknown states. A disconnected server is
|
|
113
|
-
unreachable, not evidence that its agents stopped. Do not infer needs-input
|
|
114
|
-
or task completion solely from terminal activity.
|
|
115
|
-
|
|
116
|
-
An agent page offers conversation, start controls and session details. Starting
|
|
117
|
-
a stopped agent uses its existing home and shows runtime/model options and
|
|
118
|
-
effective permission mode. Make a launch override distinct from editing future
|
|
119
|
-
defaults. A running agent's model does not silently change because a setting
|
|
120
|
-
was edited. Interrupt and retirement are explicit actions with their existing
|
|
121
|
-
semantics; retirement is not relabeled as a harmless Stop button.
|
|
122
|
-
|
|
123
|
-
The composer supports text and selected photos/files with visible upload state.
|
|
124
|
-
Upload to the agent's execution host, preserve the destination while a transfer
|
|
125
|
-
is in flight, and submit only when attachments are ready. Failed transfers stay
|
|
126
|
-
visible and must not silently redirect to another agent. Start with a file/photo
|
|
127
|
-
picker; system dictation can supply text. A native share extension and realtime
|
|
128
|
-
spoken conversation are later options.
|
|
129
|
-
|
|
130
|
-
Terminal access is a secondary view for interactive harness prompts and tools.
|
|
131
|
-
Provide touch-accessible Escape, interrupt and other essential terminal keys.
|
|
132
|
-
Avoid exposing tmux session names, Desktop split layouts or backend chrome.
|
|
133
|
-
Pasting or uploading into a terminal does not automatically press Enter; a
|
|
134
|
-
conversation Send action is an explicit submission.
|
|
135
|
-
|
|
136
|
-
## Reliable conversations and background behavior
|
|
137
|
-
|
|
138
|
-
Terminal input is useful across harnesses, but a pane transcript is not a
|
|
139
|
-
durable conversation model. Rich chat should use the selected messaging
|
|
140
|
-
provider, initially aweb. Missing durable reply, read-state or replay semantics
|
|
141
|
-
belong in that provider's contract, not an OATS-specific message database or an
|
|
142
|
-
ANSI-output parser. An installation without those capabilities can still offer
|
|
143
|
-
management and a terminal, with chat availability described honestly.
|
|
144
|
-
|
|
145
|
-
Before qualifying chat, establish the following behavior:
|
|
146
|
-
|
|
147
|
-
- The operator has their own sender identity; the client does not impersonate
|
|
148
|
-
the destination agent. Replies remain associated with the conversation.
|
|
149
|
-
- Stable message IDs and replay cursors allow reconnect and missed-message
|
|
150
|
-
retrieval. Retry after an uncertain send does not submit the same request
|
|
151
|
-
twice. Offline text remains a draft until explicitly sent; do not queue
|
|
152
|
-
terminal keystrokes or destructive controls for automatic replay.
|
|
153
|
-
- Accepted, delivered and acted-on are different observations. An input write
|
|
154
|
-
or agent wake is not proof of a completed task. Unknown outcomes remain
|
|
155
|
-
unknown until the existing operation can be reconciled.
|
|
156
|
-
- Delivery and wake continue on the server while clients are absent. Waking a
|
|
157
|
-
running harness and starting a stopped instance are different actions;
|
|
158
|
-
follow explicit policy before a message starts an agent or consumes compute.
|
|
159
|
-
|
|
160
|
-
iOS normally suspends background apps. Do not depend on an always-connected
|
|
161
|
-
phone SSE, WebSocket or SSH session. The server retains state; a notification
|
|
162
|
-
signals new activity, and reopening the client fetches authoritative updates.
|
|
163
|
-
Notifications can be delayed or disabled and are not delivery receipts.
|
|
164
|
-
[Apple background execution documentation](https://developer.apple.com/documentation/uikit/extending-your-app-s-background-execution-time)
|
|
165
|
-
|
|
166
|
-
Home Screen web apps support Web Push on iOS/iPadOS 16.4 and later, with
|
|
167
|
-
permission requested through user interaction. Native applications can use
|
|
168
|
-
APNs. Both require a server-side notification path and device testing. Keep
|
|
169
|
-
sensitive message bodies out of lock-screen notifications by default. Private
|
|
170
|
-
application access can remain on Tailscale while the server makes outbound
|
|
171
|
-
connections to the push service; test this combination on a real phone rather
|
|
172
|
-
than assuming VPN reconnection or notification behavior.
|
|
173
|
-
[WebKit Web Push documentation](https://webkit.org/blog/13878/web-push-for-web-apps-on-ios-and-ipados/)
|
|
174
|
-
[Apple remote notification documentation](https://developer.apple.com/documentation/usernotifications/setting-up-a-remote-notification-server)
|
|
175
|
-
|
|
176
|
-
## Proposed delivery sequence
|
|
177
|
-
|
|
178
|
-
1. **Prove the service boundary.** Extract only what an independent client
|
|
179
|
-
needs, retain existing CLI dispatch and add authenticated network access.
|
|
180
|
-
Qualify one server over Tailscale, including operation with Desktop closed.
|
|
181
|
-
2. **Deliver mobile management and terminal access.** Workspace/agent list,
|
|
182
|
-
start with model choices, explicit lifecycle actions, terminal input/output,
|
|
183
|
-
screenshots/files and reconnect. Reuse existing schedule controls and
|
|
184
|
-
provider inspection. This is useful without claiming polished chat.
|
|
185
|
-
3. **Qualify conversations and notifications.** Resolve the messaging-provider
|
|
186
|
-
contract gaps, then implement conversation presentation, replay, send
|
|
187
|
-
deduplication and opt-in notifications. Prove delivery while the app sleeps.
|
|
188
|
-
4. **Decide on native and broader hosting.** Use actual phone experience to
|
|
189
|
-
choose whether native sharing, voice and polish justify another client.
|
|
190
|
-
Expand to multiple servers through existing routes or explicit endpoints;
|
|
191
|
-
avoid adding a fleet control platform as a prerequisite.
|
|
192
|
-
|
|
193
|
-
The browser client is the recommended first delivery vehicle, not an
|
|
194
|
-
architectural dependency. If native is chosen first, the same server and
|
|
195
|
-
messaging requirements apply. No calendar estimate is justified until the
|
|
196
|
-
service extraction and conversation-contract gaps have been scoped.
|
|
197
|
-
|
|
198
|
-
## Acceptance before calling it usable
|
|
199
|
-
|
|
200
|
-
- With Desktop closed and the phone locked or disconnected, existing agents
|
|
201
|
-
keep running and an explicitly enabled test schedule and message wake work.
|
|
202
|
-
No production team or harvest schedule is changed to demonstrate this.
|
|
203
|
-
- Start the intended stopped home with the chosen runtime/model. Same-named
|
|
204
|
-
instances elsewhere cannot receive its actions. Unreachable hosts display
|
|
205
|
-
uncertainty and retrying an interrupted mutation does not blindly repeat it.
|
|
206
|
-
- Upload an actual iPhone screenshot and a file to the execution host; verify
|
|
207
|
-
complete bytes and destination, and demonstrate a visible transfer failure.
|
|
208
|
-
- Switch Wi-Fi/cellular, lock/unlock, and reconnect. Conversation history catches
|
|
209
|
-
up without duplicate sends. A terminal reconnect can show a bounded current
|
|
210
|
-
capture; it must not pretend to recover a durable conversation transcript.
|
|
211
|
-
- Close terminal views and disconnect abruptly without killing agent sessions
|
|
212
|
-
or accumulating PTYs. Repeated reconnects and slow clients leave bounded
|
|
213
|
-
memory/process use; share observations instead of polling each agent per view.
|
|
214
|
-
- Test a real notification, denied notification permission, expired client
|
|
215
|
-
access and tailnet disconnection. The UI preserves drafts and accurately
|
|
216
|
-
states what it knows, without showing an unsuccessful send as delivered.
|
|
217
|
-
- A different knowledge provider's declared operations remain usable without
|
|
218
|
-
mobile code assuming OKF, a particular file layout or a universal harvester.
|
|
219
|
-
|
|
220
|
-
Open implementation decisions are the initial operator authentication method,
|
|
221
|
-
the existing aweb contracts that need extension, notification ownership under
|
|
222
|
-
the messaging provider, and the precise terminal stream protocol. Settle them
|
|
223
|
-
with narrow proofs before expanding scope. This proposal changes neither
|
|
224
|
-
current deployment defaults nor the priority of ongoing reliability work.
|
|
225
|
-
|
|
226
|
-
Related contracts: [provider operations](operations-contract.md),
|
|
227
|
-
[Desktop CLI API](../desktop-cli-api.md), [servers](../servers.md),
|
|
228
|
-
[schedules](../schedules.md), and [Desktop](../desktop.md).
|