Skip to content

DO NOT MERGE — merge train: 2932,2923,2931,2933,2867,2929 - #2934

Closed
vybe wants to merge 16 commits into
devfrom
train/20260921-1418
Closed

vybe wants to merge 16 commits into
devfrom
train/20260921-1418

Conversation

@vybe

@vybe vybe commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Integration surface for #2932, #2923, #2931, #2933, #2867, #2929.

Never merged; members merge individually once green. Assembled off dev @ 0c470c7, all six members validated READY this run (zero ejections).

No closing keywords here by design — the members carry those.

obasilakis and others added 16 commits September 17, 2026 14:37
…oken

trinity-do-create.sh prompted for a Claude subscription token and had first
boot register it and assign it to the seeded agents. Connecting Claude is now
the onboarding overlay's blocking step (trinity-enterprise#582), which accepts a
subscription token or an API key, checks it with Anthropic before saving, and
hands it to the agents that have none. The installer's copy was an unchecked
duplicate that also forced every operator to run `claude setup-token` before a
server existed.

The installer now asks three questions (password, region, name). First boot no
longer logs in, calls /api/subscriptions or needs jq, and the user-data carries
only the admin password. The finish message says Claude is connected after sign-in.

PROV-014, the hosted-install flow and the three user docs that described the
token prompt are updated to match. New test: the installer reaches the end on
three answers plus the confirmation, prints no setup-token prompt, and its
user-data registers nothing (red against the previous script).

Refs #2380

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Local dev was 156 commits behind origin/dev (three intervening weekly
runs never reached origin since dev is protected); re-ran from a fresh
branch off origin/dev tip for accurate churn/complexity numbers.
Resolve the two docs conflicts by keeping dev's new DigitalOcean guide
links and FAQ question, without the Claude token step the installer
no longer has.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The installer stopped prompting for a subscription token, but the
DigitalOcean guide still walked operators through claude setup-token,
listed the token among the installer's questions, and named a log line
the first-boot script no longer writes as the install's success signal.

The guide now drops that step and its troubleshooting rows, and sends
operators to the Connect Claude step on first sign-in. The install's
success signal is the last log line, '=== Trinity is ready at ... ===',
which the first-boot script writes only after start.sh succeeds. The
docs index card and the single-server cross-link lose the token too.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…indings from Trinity's own starters (#2899)

`T-004`/`T-005` failed an ABSENT `resources` block, so every agent created from
`scout`/`sage`/`scribe` — the three templates a fresh install seeds as the
`acme-*` fleet — opened its Overview tab with a red "2 must-fix" banner. Absence
is the supported shape: the agent inherits the admin's fleet-wide default
(RES-001), and a template-level block would override both that default and the
values a manifest or API caller asked for (`crud._resolve_local_template`).
#1908 parked this as a product decision behind a two-check waiver; the decision
is INHERIT.

* T-004/T-005 pass on an absent/null/empty declaration, naming the default in
  the message. A declared value is validated by the create path's own
  `normalize_cpu`/`normalize_memory`, so the check accepts exactly what creation
  accepts (`4G`, unquoted `cpu: 2`) and rejects exactly what it rejects — T-005's
  old regex passed `512m`, which `normalize_memory` 400s. Values are `_clip`ped
  before they reach a message: `template.yaml` is agent-writable.
* A non-mapping `resources:` fails T-004 and skips T-005 — one malformed block,
  one finding. The create path raises AttributeError on it, unguarded.
* `_KNOWN_FAILING_CHECKS` is now EMPTY, so the #1908 guard holds every visible
  bundled template to every HARD static check with nothing exempt.
* The generic `PUT /api/settings/{key}` refuses `agent_default_cpu`/
  `agent_default_memory`. The dedicated route validates them; unvalidated, a
  junk default 400s every creation that relies on it.
* `X-004` exempts the platform-injected `trinity` server in the
  template.yaml-only direction; a template shipping its own `trinity` block is
  still reported.
* The panel headline counts must-fix only: "N must-fix compatibility issues"
  (danger), "No must-fix issues · N recommendations" (neutral — the API still
  calls that state `issues`, and soft covers S-006/S-008), "Compatible" only at
  zero. Skipped AI checks collapse to one line per reason; with no Anthropic key
  that was 30 rows of 89 burying the real findings. Dead `infoCount`/`failing`
  computeds removed.

Docs: validation spec (incl. X-004's type column, which said AI for a STATIC
check), agent guide's "resources (required)", requirements §4.1.1, feature flow.

Out of scope, filed: #2903 (canary `512m`), #2904 (MCP names declared in three
places), Abilityai/cornelius#9 (that template's own findings).

Fixes #2899

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… its git remotes" alert (#2930)

The ent#615 sweep decided "could I see this tree?" with one flag, `root_readable`,
set by `[ -d .git ] && [ -r ] && [ -x ]`. That fails on EXISTENCE as readily as on
permissions, and an agent created from a `local:` template has no repository at
all — so every stock starter (`acme-scout`/`sage`/`scribe`) filed an operator alert
on every fresh install, and the alert told a first-time operator that the cause was
`agent_full_capabilities=off` withholding DAC_OVERRIDE. On the instance this was
found on, that setting was unset (defaults to true) and the container held
DAC_OVERRIDE: the named cause was not the cause.

The sweep now reports two more facts, and the caller splits them:

* `root_traversable` — can this exec enter ROOT at all? The capability question,
  asked about ROOT rather than about the repo, because a missing DAC_OVERRIDE
  fails the `-d .git` test too and makes "absent" and "unreachable" identical.
* `git_present` — is there a repository here? "Nothing to sweep" is not a finding.

Traversable + absent → no alarm, one debug line. Everything else alarms exactly as
before, so the ent#615 property is untouched: an all-zero report from a tree the
sweep could not see is still never an all-clear. A report carrying neither flag
parses both as 0 and routes to the alarm, which is the pre-#2930 behaviour.

Tests: the real script against a repo-less directory, a real repo, and an
unreadable one (positive controls on both flags), plus the four consumer shapes —
absent, unreachable ROOT, present-but-unreadable, and an old flagless report.

Fixes #2930

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…cean button

The Trinity 1-Click is live on the DigitalOcean Marketplace. The README's
"Don't want to run it on your laptop?" callout now points to it first, with the
sizing and first-login steps from the listing, and keeps the guided installer as
the scripted alternative. The button and link carry the Ability AI referral
code from the Vendor Portal.

Refs #2281

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ted (#1989) (#2847)

Operator decision 2026-09-16: the edge adapter wins, not the scope cut.
The durable queue carries all traffic including human-interactive chat,
and the synchronous push dispatch path is deleted once the two supporting
pieces land (#2842 queue priority, #2843 one turn per conversation).

Three documents asserted the opposite and would have relitigated this:

- TARGET_ARCHITECTURE.md Open Question 7 said "under consideration, not
  decided" and named the scope cut as the candidate answer.
- PULL_MIGRATION_STATUS.md said "everything is pull" is false *by design*,
  and listed interactive chat as deliberately excluded.
- PULL_MIGRATION_TESTING.md described the exclusion as a settled scope cut.

All three now state the decision and its reasoning, so the question cannot
be reopened from the documents themselves.

Two corrections ride along, both measured on eu2 during the #1766 soak:

- The starvation argument that favoured the scope cut was overstated. Push
  does not avoid the wait either — chat already queues in a bounded
  in-memory FIFO at capacity, and the worst case there is already ~32
  minutes. What push avoids is waiting behind queued batch work, which
  priority ordering restores. Parity is the bar, not instant.
- The session-serialization requirement is mutual exclusion per
  conversation, NOT worker affinity. All workers share one container
  filesystem, so pinning buys nothing and would make a person wait on a
  busy worker while others idle. Affinity only matters at replica_count>1.

Also adds `retry` to the reach table (#2845) — it is in neither trigger
set and is 4.7% of eu2's traffic, which Phase 5 cannot delete around.

Based on docs/pull-migration-consolidate rather than dev, because that
branch already rewrites all three files.


Claude-Session: https://claude.ai/code/session_019Tm7UEkd4G9KQZD5oeLRSa

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Open Question 7 is decided for the queue: the pull pilot's exclusion of
interactive turns is a migration state until interactive priority (#2842)
and per-conversation exclusion (#2843) land, not the scope-cut design
boundary the code comments and test docstrings still described.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ui PR touches the frontend UI — triggers Playwright e2e tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants