Fluxo de setup da frota
Esta página explica como um manager padroniza o Octopus em 6+ repos de uma
vez — o fluxo de semeadura ponta-a-ponta por trás do
fleet-bootstrap. Assume uma
frota multi-stack com código legado, porque é esse o caso que molda o design.
O modelo numa imagem
┌─────────────────────── workspace repo ───────────────────────┐ │ rules/common/*.local.md (shared rules, symlinked) │ manager ──► │ fleet.yml (baseline + profiles + tiers + │ edits one │ repos map) │ file │ templates/{ide,precommit,ci}/<stack>.* (optional standard) │ └───────────────┬───────────────────────────────────────────────┘ │ fleet-bootstrap reads it ▼ for each repo: compose .octopus.yml = baseline ∪ profile(s) ∪ tier │ ▼ `octopus setup` ──► seeds the repo (rules, hooks, agent config, .editorconfig, .husky)O manager edita um fleet.yml; cada repo recebe um .octopus.yml composto
e é semeado pelo octopus setup. Os repos nunca contêm fleet.yml — só o
resultado composto.
O padrão em camadas
Não existe um .octopus.yml canônico único numa frota multi-stack. O padrão é
composto por repo:
baseline stack profile adoption tier (every repo) (detected or pinned) (per repo) ───────────── ───────────────────── ────────────── agents dotnet → backend+dotnet T0 hooks:false workflow node → backend T1 hooks:true + enforce-ide workspace: frontend→ frontend T2 + enforce-precommit + CI quality, docs python → backend mentor, architect, security └──────────────────┬───────────────────────────┘ ▼ composed .octopus.yml for the repofleet.yml
# <workspace>/fleet.ymlbaseline: agents: [claude, opencode] workflow: true workspace: git@github.com:acme/octopus-workspace.git bundles: [quality, docs] # tech-lead is the manager's install, not baseline roles: [mentor, architect, security]
profiles: dotnet: { detect: ["*.sln", "*.csproj"], bundles: [backend], skills: [dotnet] } node-backend: { detect: ["package.json + (express|nestjs)"], bundles: [backend] } frontend: { detect: ["package.json + (react|next)"], bundles: [frontend] } python: { detect: ["pyproject.toml", "requirements.txt"], bundles: [backend] }
tiers: T0: { hooks: false, precommit: false, qualityWorkflow: false } T1: { hooks: true, precommit: false, qualityWorkflow: false } T2: { hooks: true, precommit: true, qualityWorkflow: true }
repos: - { path: ../billing-api, profile: dotnet, tier: T0 } # legacy - { path: ../checkout-web, tier: T1 } # auto-detected - { path: ../payments-svc, profile: node-backend, tier: T2 } - { path: ../legacy-erp, profile: [dotnet, frontend], tier: T0 } # monorepoA cadeia de semeadura
fleet-bootstrap octopus setup enforce-*─────────────── ───────────── ─────────1. resolve profile + tier2. compose .octopus.yml3. diff vs current ─ preview4. (--apply) write manifest └──────────────────────► expand bundles deliver rules (workspace symlinked) deliver skills / roles / knowledge if T1+: ───────────────────────────► .editorconfig (per stack) if T2+: ───────────────────────────► .husky / pre-commit (per stack) if T2: qualityWorkflow CI template5. (--pr) branch + PR per repoO fleet-bootstrap escreve só o .octopus.yml. Todo o resto é trabalho do
octopus setup — idêntico a um install de repo único. .editorconfig /
.husky específicos da stack são gerados detectando a stack de cada repo (um
monorepo ganha os dois), idempotente e respeitando o que existe.
O ratchet de tiers (adoção do legado)
T0 ───────────────► T1 ───────────────► T2 capabilities loop-level full ─────────── ────────── ──── hooks: false hooks: true + enforce-precommit (.husky) no .editorconfig + enforce-ide + qualityWorkflow (CI) no .husky (.editorconfig) no CI no commit/CI gate blocking floor on every commit/PR
safe on any legacy catches new only when the repo immediately assistant drift is cleanA sacada: hooks loop-level só agem no que o agent edita daqui pra frente — não
reprovam o código legado existente. Quem quebra o legado é o pre-commit
git-level e o CI, então esses moram no T2. Um repo legado começa em T0/T1; o
manager edita o tier: no fleet.yml e re-roda pra promovê-lo.
Precedência de template de config
Quando o enforce-ide / enforce-precommit escrevem .editorconfig /
.husky, a fonte é resolvida com o maior ganhando:
1. project-local the repo's own file / *.local.md ← always wins 2. workspace template <workspace>/templates/{ide,precommit}/<stack>.* 3. generated default Octopus stack-inferred generation ← fallbackAssim um manager da frota cura um padrão de editor/git no workspace, e ele sobrescreve o default genérico gerado — enquanto a escolha local intencional de um repo ainda ganha, e a geração preenche as lacunas. Essa é a precedência de template de config do workspace.
A merge policy
Um repo que já tem um .octopus.yml é mergeado por chave, nunca clobberado:
converge baseline + tier values (add missing; set hooks/CI) keep local additions matching the profile (justified — e.g. backend-developer) flag local additions matching neither (⚠ conflict — keep or drop?) flag any tier de-escalation (⚠ reducing enforcement) survive *.local.md rule overrides (project layer always wins)Nada é removido em silêncio; de-escalações e keeps arbitrários são expostos pra um humano — essa é a merge policy não-destrutiva da frota.
Exemplos de uso
Primeiro bootstrap — preview, depois apply:
# dry-run: print the per-repo diff, write nothingoctopus fleet bootstrap# apply: write the merged .octopus.yml + run octopus setup in eachoctopus fleet bootstrap --applyPromover um repo legado de tier — edite o fleet.yml (tier: T0 → T1),
depois:
octopus fleet bootstrap --apply # only the changed repo actually changesAdicionar um novo repo — anexe-o em repos: (perfil auto-detectado), depois
apply.
Rollout guardado via PRs (nunca dá push em main):
octopus fleet bootstrap --apply --prRemediar só o que driftou — alimente um relatório do audit-fleet:
octopus fleet bootstrap --apply --from-audit fleet-report.mdVeja também
- skill
fleet-bootstrap - Composição de bundles — como bundles expandem
audit-fleet— a metade detect de detect → remediate