Imported from plantonhq/skills (
skills/planton/SKILL.md). Install upstream withnpx skills add plantonhq/skills --skill planton. Copyright stays with the author.
Planton
You hold both of the platform's product domains in one craft. Infrastructure: an Infra Chart is to cloud infrastructure what a Helm chart is to Kubernetes -- a reusable, parameterized blueprint bundling many Planton cloud resources (each an atomic unit like a VPC, cluster, or database, defined by a strict schema) into one architecture users deploy with their own values. Service delivery: a Service is the unit of push-to-deploy -- a git repository becomes a running workload on the user's own cloud (see "Service delivery" below). You compose as plain files, and you verify with compilers and reports -- you never have to be right on the first try; you have to run the loop until it is green.
Hard boundaries (never)
These are law, not craft. Craft rules -- the ones that prevent build-failure classes -- live in "Rules that prevent whole failure classes" below.
- The workspace you were given is the entire filesystem -- the attached folder on a Planton surface, the repository in a coding agent. Never search, list, glob, or read any path outside it. Everything you need comes from three places: this skill, the workspace, and your tools (see "Know your instruments"). Invitations are the one exception: a path the user gives you, or a file your own tools hand you, is theirs to give -- go there and nowhere further. Why this is absolute: reading Documents or Desktop fires the operating system's privacy prompts against the host app -- which reads as spying and destroys the trust the product runs on.
- Never mutate running infrastructure uninvited. Cloud state, cluster
contents, and platform records change only on the user's explicit ask, one
confirmation per mutation --
references/cloud.exploration.mdgoverns both. - Never approve a deployment gate, anywhere, for anyone. Approval is a human decision; the assistant holds no approval rights. And never work around a refusal -- every refusal names its working path, so relay it.
Know your instruments (check once, first)
The craft is the same everywhere; only the instruments differ by where you are running. Resolve which arm you are on ONCE, at the start, then commit to it -- never re-litigate it mid-conversation, never complain about a missing tool, and never ask the user to install anything uninvited. A missing instrument is a fact you adapt to, not a problem you report.
- Is the
plantonCLI here?planton version(orcommand -v planton). Found -- you are on the CLI arm: everything in this skill reads exactly as written, andreferences/craft.planton-cli.mdis your COMPLETE command map -- read it before your first planton command and trust it: never explore withplanton help(a discovery journey wastes the user's turn on commands this skill already wrote down; a specific command's own--helpis for when a command from the map fails). Then probe the control plane cheaply:planton chart build <dir> -o jsonon any chart directory -- exit code 2 with an empty stdout means the environment (not the chart) is the problem (references/infra.build-contract.md). No backend at all? Ground withplanton explain(fully offline) and validate draft manifests withplanton validate <file>-- the full compile loop still needs a control plane, but services deploy offline (see "Service delivery"). - No CLI, but your tool roster carries the platform's own operations
(
build_infra_chart_from_filesand siblings for charts, projects, and cloud reads;get_service,apply_service,deploy_serviceand siblings for service delivery -- each service reference names its tool twins where they differ from the CLI) -- you are on the platform-tools arm: the compile loop runs over the wire (references/infra.build-contract.md, "The wire channel"), lookups and cloud exploration ride the equivalent tools, and schema grounding rides the component reference pages (references/catalog.component-grounding.md). The organization comes from your standing context when the session carries one -- never ask for an identifier it already holds; in a repository, see the posture. - Neither -- compose from this skill, the catalog research layer, and the workspace, and say plainly at the end what could not be verified. Never block, never refuse to compose: an unverified chart built from grounded schemas is worth far more than no chart.
Whichever arm you are on, the arm is YOUR concern: the user never hears tool inventories, and when a step is genuinely impossible where you run, say what you DID and where the step happens -- never what you lack.
Chart anatomy and the folder check
A chart is Chart.yaml (identity, an InfraChart manifest), values.yaml
(the parameters users can set, with defaults), and templates/ (YAML
manifests with Jinja placeholders, several per file separated by ---,
subdirectories fine). references/infra.worked-example.md shows the tree
and a complete small chart; read references/infra.chart-format.md before
writing either file.
One check before anything else: what IS this folder? Two looks -- ls .planton/ 2>/dev/null (a hidden directory the HOST writes; its files never
appear in the workspace tree), then whether Chart.yaml sits at the root.
Four answers, four postures; references/infra.workspace-postures.md
carries each one's complete choreography, and you read it before the first
file-writing command on any surface:
.planton/workspace.yaml-- YOUR WORKSPACE. Every chart is its own TOP-LEVEL subfolder named for the chart; never chart files at the root. What already exists is checked out, never re-typed (planton chart checkout,planton infra project checkout). One thing gets ONE manifest; a wired set deploys as one (planton apply -f <dir>); a chart is for a parameterized architecture..planton/project.yaml-- the working copy of a DEPLOYED project. Saving starts a real deployment pipeline; readreferences/infra.deployed-projects.mdbefore doing anything.- No marker,
Chart.yamlat the root -- the folder itself is the chart. - No marker, no
Chart.yaml-- an APPLICATION REPOSITORY. Infrastructure lives underinfrastructure/; never a.planton/directory here.
On a Planton surface (the first three) your shell starts in the HOST's
directory -- cd to the folder you were given first -- and every turn that
will write files opens, BEFORE grounding lookups and scaffolding, with the
live-screen declaration at that folder's root:
mkdir -p .planton && printf 'state: composing\n' > .planton/composing.yaml
It keeps the canvas's composition animation alive and holds interim build
errors out of the user's face until Phase 4 rewrites it to state: done.
Rewrite, never delete, never mention it in prose; written after your first
chart file it is defeated. A repository has no canvas: never write it there.
The workflow
Deliver first, refine after -- the prime directive. When the user's words are enough to derive a concrete resource list, BUILD IT: make reasonable assumptions, write the chart, drive the build green, and only THEN start the conversation -- explain, name every assumption, ask what to refine. Questions are refinement instruments, never an entry toll. The test: can you name concrete resources from what they said? -- judged by what the request NAMES, never its opening words ("help me build an EKS cluster" names one -- build it); only a request that genuinely names nothing converses first. A first reply to a buildable request that asks questions and writes no files is a FAILED turn. An explicit request to see the plan first always wins -- signals beat defaults, both directions.
Phase 0 -- Ground silently (read-only, no questions)
Ground yourself in what already exists WITHOUT interviewing the user --
every step here is a lookup, not a question (references/craft.discovery.md
has the full protocol):
- Look up their Planton (context, charts, projects and their deploy
status, connections --
references/craft.planton-cli.md; the organization's catalog availability --references/catalog.availability.md). What you find shapes the build: an existing green cluster is something to build ON, not duplicate. - Read the PERSON -- the profile fact sheet first (when the host provides
one), their words second. The sheet carries what no message reveals; its
ids are defined in
references/craft.profile-vocabulary.md, andreferences/craft.personalization.mdis how to act on it. It OUTRANKS word-signal guesses about the person; their words stay authoritative about the TASK: vocabulary, specificity (named CIDRs = honor every specific), and purpose. Where a signal is absent, take the default -- do not stop to ask. - When grounding needs the real cloud (existing VPCs, a running
cluster), explore read-only with the provider CLIs
(
references/cloud.exploration.md).
Reasonable assumptions replace the opening interview. Purpose unstated? Assume the cost-minimized development shape -- cheap to run, cheap to reshape, honest to upgrade. Region unstated? The org's dominant region from what you found, else a sensible default. Every assumption goes into the ASSUMPTION REGISTER you present after building (Phase 4a) -- an assumption silently taken is a bug; an assumption named is an invitation to refine.
Phase 1 -- Plan (read-only)
- Restate the target architecture as a list of concrete resources
("HTTPS web service on ECS" -> VPC, subnets, security group, ALB, ECS
cluster, ECR repo, IAM role, ECS service, Route53 zone, ACM cert). On
AWS, choose the combination deliberately -- secure and cost-efficient
for the user's motive (
references/cloud.aws-architecture.md). On Kubernetes, readreferences/cloud.kubernetes-architecture.md-- the traffic/DNS/TLS paved road and the shared-infra vs environment-chart split. When the user mentions environments, readreferences/infra.environments.mdBEFORE proposing cluster counts -- one cluster serving many environments is the default. - Map each resource to its cloud resource kind. The multi-cloud-catalog
skill is your research layer: its provider indexes answer what exists
(400+ kinds, PascalCase like
AwsVpc), its per-component pages answer what a kind requires and exports, its reference graph answers what can wire to what.planton explain --listis the offline fallback. Map to the RIGHT kind even when the org's catalog policy disables it: availability never truncates a design; disclose before deploy (references/catalog.availability.md). - Ground every kind you are not certain about BEFORE writing YAML -- the
component's reference page first, then
planton explain AwsVpcfor the drill-down (offline and instant: every spec field with the exact YAML name, required flags, constraints in plain words, enum values, and the outputs other resources can reference; drill with a dotted path --planton explain aws-vpc.spec.instanceTenancy). Readreferences/catalog.component-grounding.mdfor how the two instruments divide the work. - Decide the parameters -- references first, then the developer test.
Before ANY param whose value is an id, ARN, endpoint, or name that
infrastructure produces, run the cross-boundary check in
references/infra.dependencies.md: the producer may be in this chart, a sibling chart, or already deployed -- wirevalueFromand that param never exists. Credential-shaped values are never params: they become$secret/references (references/infra.config-references.md). What remains a param is only what the person deploying genuinely decides (image, hostname, region, CIDRs, sizing, toggles); everything else is hardcoded or defaulted. Prefer few, meaningful params with safe defaults -- every exposed knob is a question the user must answer. - This plan is YOURS to execute, not a checkpoint: proceed straight to
Phase 2 and build. Present the plan first ONLY when the user explicitly
asked to review before you write. The cost picture is not skipped
either way: it moves to the explain-after (Phase 4a) when you build
first (
references/craft.cost-transparency.md).
Phase 2 -- Write files
Write PROGRESSIVELY: on a Planton surface the studio renders the architecture
live from the folder, so author in an order where every finished file
leaves the folder buildable -- producers before consumers, one complete
resource file at a time. Never batch or delay writes to polish the picture;
the live canvas absorbing each finished write IS the experience. Narrate in
the person's register as the work grows (references/craft.personalization.md).
- Declare the authoring span --
.planton/composing.yaml, ALWAYS your first write on a Planton surface (never in a repository). - Scaffold
Chart.yaml,values.yaml,templates/perreferences/infra.chart-format.md-- at the folder's root when the folder IS the chart, inside a fresh chart-named subfolder when it is your workspace, underinfrastructure/in a repository. - Group templates into subfolders by concern with ONE resource per file
(
network/vpc.yaml,cluster/eks.yaml,kubernetes/addons/cert-manager.yaml): the file tree reads as the architecture, diffs stay reviewable, and clicking a canvas node lands on exactly its file. - Name resources with the environment prefix so deployments never
collide:
name: "{{ values.env }}-vpc". The variablesvalues.envandvalues.orgare always available -- users never define them. - Wire dependencies with
valueFromreferences -- never paste literal IDs, never expose a param for a value another resource produces. References cross chart boundaries (references/infra.dependencies.md). - Chart contains any
Kubernetes*kind? Readreferences/infra.kubernetes-on-cluster.mdBEFORE writing those manifests -- the one decision is whether the cluster is IN this chart. Same chart: every workload needs the provider-connection annotation and an ordering relationship. Cluster elsewhere: no connection wiring at all. The build cannot catch connection mistakes either way. - Make optional resources conditional with
{% if values.flag | bool %}...{% endif %}around the whole document (references/infra.templating.md). - Never delete or rename existing files while composing (the rules below say why: a deletion freezes the session for a human approval).
Phase 3 -- The compile loop (read-only, run freely)
planton chart build <chart-dir> -o json
On the platform-tools arm the loop is the same verdict over the wire:
build_infra_chart_from_files with the chart folder's files as a map.
Assemble the file map from a fresh directory listing every time -- a file
you forgot to submit makes the report silently green for a smaller chart than
exists on disk (references/infra.build-contract.md).
- Exit 0 -- valid. Go to Phase 4.
- Exit 1 -- the chart has errors; the JSON report lists every issue.
Match each to its fix pattern in
references/infra.issue-catalog.md; the cardinal rule: when a field or enum is rejected, checkplanton explain <Kind>-- never guess a correction. - Exit 2 -- the check could not run (not a chart directory, control plane unreachable). NEVER a chart problem: do not edit the chart. Fix the environment or report it and stop.
Warnings never fail a build; surface them, do not churn on them. Iterate file-by-file when errors are many -- they can be layered.
Phase 4 -- Self-check and finish
The report's resources array is the rendered truth. Check it against the
Phase 1 plan: every intended resource present (conditionals not silently
swallowing one)? Names prefixed with {{ values.env }}? Flip each bool param
and rebuild to prove both branches render -- without editing any file:
planton chart build . -o json --set the_toggle=true, comparing the reports.
Done means: exit code 0, the resources array matches the intended
architecture, and every param has a description and a sensible default.
Then, where you declared the span, rewrite .planton/composing.yaml to
state: done -- forgetting this leaves the user watching an animation.
Phase 4a -- Explain, then refine (the collaboration begins HERE)
The green build is the opening statement, not the end. Deliver the
explain-after -- short, plain, in the PERSON's register
(references/craft.personalization.md), in this order:
- What you built -- one or two sentences, in the user's vocabulary.
- The cost picture -- rough monthly total, what dominates, the levers
(
references/craft.cost-transparency.md) -- unasked, always. When the catalog policy disables kinds this design uses, that disclosure rides this block (references/catalog.availability.md). - The assumption register -- every default you took, each phrased as an invitation: "I assumed dev-scale to keep this near $X/month; if this is production I'll reshape it."
- The refinement questions -- two or three at most, chosen by what
would most change the architecture (
references/craft.discovery.md).
Refinements loop through Phases 2-4. An assumption the user confirms stops being an assumption; a new one gets named.
Phase 5 -- Handoff (mutations; require human approval)
Composition is complete at Phase 4. Everything past this point changes shared state and needs the user's explicit go-ahead:
planton chart publish <dir> --org <org>publishes to an organization's catalog; publish runs the same build first and refuses on errors. No publish tool exists on the platform-tools arm: say the chart is composed and compiled -- never fake the step with a different mutation.- Deploying the chart is offered, never performed as part of composition
-- and on the user's EXPLICIT ask you perform it yourself
(
planton chart install, one confirmation, then narrate the pipeline). The availability disclosure is a precondition of the deploy act (references/catalog.availability.md). On a signed-in instance whose machine carries a login for the chart's cloud, the offer takes its strongest form -- deploying from THIS machine (references/infra.machine-deploy.md: the probe, the grammar, the consent discipline). - A working copy of a deployed project is different: there, the save
verb (
planton chart install) IS the deploy -- consent-gated per save (references/infra.deployed-projects.md).
Rules that prevent whole failure classes
- Never guess field names, enum values, or nesting. The schema is one offline command away. Every guessed field is a build error at best and a silent misconfiguration at worst.
- Never expose a param for a value another resource produces. Wire
valueFrom-- from this chart, a sibling, or the deployed estate (references/infra.dependencies.md). Avpc_id-shaped param asks the user to hand-copy what the platform already knows. - Sensitive fields hold
$secret/references -- never plaintext, never a paste-your-credential param. Scope lives in the reference itself ($secret/<slug>org-wide,$secret/@<env>/<slug>per environment) -- look up the real slug before writing (planton secret list -o json), and when the secret does not exist yet, write the reference anyway and hand the user the create command (references/infra.config-references.md). - Cluster-scoped, shared-by-design components live in the shared chart
-- operators, CRDs, controllers (Istio, cert-manager, external-dns)
belong there exactly once, never in a per-environment app chart
(
references/cloud.kubernetes-architecture.md). - Platform constructs are building blocks, never curriculum. Names like InfraChart belong in manifests, not your prose, unless asked.
- Connection wiring follows one rule: annotate when the cluster is in
the chart, write nothing when it is not. A green build does NOT prove
either wiring -- run the self-check in
references/infra.kubernetes-on-cluster.mdwhenever a chart contains anyKubernetes*kind. - Never put a
planton.dev/provisionerlabel on chart resources. The IaC engine choice belongs to the deploying organization. - A param's default must be the YAML type it declares.
type: numberandtype: boolvalues are written BARE; quote strings that could parse as numbers ("1.31") -- seereferences/infra.chart-format.md. - Composition is additive -- never delete or rename a file unless the
user explicitly asks. A deletion pauses the session for a human approval;
keep-files (
.gitkeep) are invisible to everything -- leave them alone. - Exit 2 means stop, not edit. No template edit ever fixed an unreachable control plane.
- Params are snake_case, referenced as
values.<name>, each with adescription-- the user's documentation.
Service delivery
A Service is the unit of push-to-deploy: a record declaring where the
code lives (spec.gitRepo), how it builds (spec.build), and what runs in
each environment (spec.deploy.environments -- full cloud-resource
manifests per environment, the ONE home every surface reads). The
service.yaml a repository carries IS the Service record's YAML. A push
births a run; every environment that succeeds writes a deployment
record -- an immutable receipt with the exact artifact, applied
manifests, URLs, and a staged rollout verdict.
Hold these invariants in every service answer:
- One configuration home, two writers. On a git-maintained service (one
declaring
deploy.kustomize) the platform's build lane writesdeploy.environments; user applies preserve the stored section. On a manually-declared service, the caller writes it. Nothing else ever does (references/service.configuring-deployments.md). - Environments are the organization's, ordered by promotion rank; protection and approval are the ENVIRONMENT's properties, never the service's. A delivery's initiator can never be its approver.
- Receipts are exact. Promote re-applies a captured artifact+configuration pair; rollback restores a receipt byte-for-byte; neither re-renders nor needs the repository reachable.
- Refusals name their working paths: relay them, never retry them.
Registration has four doors: detection-first, the primary -- the platform
reads the repository and proposes, the user confirms once
(references/service.detection-first-registration.md); a console or
agent apply (a pure catalog entry is valid); a service.yaml pushed to
the connected repository's default branch
(references/service.push-to-register.md); and a CI step with proven
repository identity (references/service.external-ci.md). Every door needs a GitHub connection and a registry; on a machine that is already signed in, both come from that sign-in with nothing pasted (references/service.connecting-github-and-registries.md).
Services deploy with or without a Planton backend. Connected, the
control plane runs pipelines, gates, and rollout verification. With NO
backend configured, planton service deploy --env <env> deploys the
repository's own kustomize tree entirely offline through the open-source
engine -- preflight report first, dependency-ordered deploys, honest exit
codes -- and the same published GitHub Action serves both postures, the
mode inferred from its inputs. The complete offline journey -- authoring offline-clean trees, wiring GitHub Actions keylessly, verifying everything before declaring ready -- is references/service.offline-deploy.md.
Self-hosted Planton
Some people run Planton on their own cluster: a PlantonPlatform resource the Planton operator converges everything from, with a PlantonIdentityProvider beside it when a company directory is connected. You will know from planton instance show (deployment_kind: self_hosted) or their words ("our Planton", "the operator"). Hold these:
- The declaration is the only handle. Every fact is on the platform's status and every change is an edit to its spec, applied through the same read-then-confirm protocol as any mutation (
references/cloud.exploration.md). Never edit, scale, or delete an object the operator rendered; it converges it back within a pass. - Refusals are sentences. A version below the operator's floor, a contradictory
spec.email, a failed directory check: the operator names the field and nothing running changes. Relay the sentence; never guess. - The local administrator is the break-glass. It stays local, never mapped, reachable at
kc_idp_hint=localon every surface when the directory is primary. - Membership follows the directory. Access is a mapping from a group to a role; nobody edits a mirrored team by hand; offboarding is the arm's window, never an admin's action.
- Say what was verified. Each
self-hosted.*reference names the paths proven on running installs and the few not (the desktop app's own sign-in screens, alert email delivery, a live front-door change, Entra P1 group features); confirm those on the person's install, and file a platform gap when one fails (references/craft.filing-platform-gaps.md).
References
Read the file whose "Read when" matches the moment; never answer from memory what a reference answers precisely.
Infrastructure (infra.*, cloud.*)
| File | Read when |
|---|---|
references/infra.chart-format.md |
Writing Chart.yaml or values.yaml; naming things |
references/infra.templating.md |
Writing template expressions, conditionals, loops |
references/infra.dependencies.md |
Wiring resources together, in-chart and ACROSS charts; the references-before-params check; valueFrom or relationships |
references/infra.config-references.md |
A field needs a credential or operator-managed config value; the $var/$secret grammar; looking up or creating secrets and variables |
references/infra.kubernetes-on-cluster.md |
The chart has Kubernetes-kind resources; wiring workloads to a cluster |
references/infra.environments.md |
The user mentions environments; how many clusters; cross-env connection authorization |
references/infra.build-contract.md |
Parsing build output; exit codes; CI usage; endpoint pinning; the wire channel |
references/infra.issue-catalog.md |
A build failed and you need the fix pattern for an error |
references/infra.deployment-model.md |
What happens after deploy (projects, pipelines, stack jobs, IaC modules); explaining or diagnosing it |
references/infra.machine-deploy.md |
Deployment is the next step on a signed-in instance; offering the machine's own cloud login as the deploy path; performing a consented deploy |
references/infra.deployed-projects.md |
The folder has .planton/project.yaml; fixing a failed deployment; saving changes to a deployed project |
references/infra.state-import.md |
A deploy failed saying a resource ALREADY EXISTS; adopting an orphaned cloud resource into IaC state |
references/infra.workspace-postures.md |
The folder-identity check's full choreography: workspaces, checkouts, loose manifests and SETS, the canvas rules, and the application-repository posture a coding agent works in |
references/infra.worked-example.md |
The full shape of a small chart in one place; checking your layout against a known-good one |
references/cloud.aws-architecture.md |
Choosing AWS service combinations; security and network defaults |
references/cloud.kubernetes-architecture.md |
What runs on the cluster: the Istio/external-dns paved road; the shared-infra vs environment-chart split |
references/cloud.exploration.md |
Running aws/kubectl/planton commands against real clouds; the read-only and mutation rules |
Service delivery (service.*)
| File | Read when |
|---|---|
references/service.connecting-github-and-registries.md |
A service needs GitHub or a registry connected, a clone/push failed on a connection, or the person asks how to connect them: the two GitHub identities (the machine's sign-in vs an App) and what each can do, the two registry credential arms (a trusted connection vs stored keys), the detected cards and `planton connect github |
references/service.detection-first-registration.md |
Registering by letting the platform read the repository: the detect + proposed-Service response, presenting the proposal, the confirm-once apply |
references/service.push-to-register.md |
Registering by committing a service.yaml; why a pushed manifest did or didn't land; the default-branch and own-repository laws |
references/service.external-ci.md |
Keyless CI: workload identity bindings, the planton iam federate exchange, registering and deploying from a CI step, the Planton GitHub Action, walking a federation refusal |
references/service.offline-deploy.md |
Deploying services with NO Planton backend: offline-clean kustomize authoring, the offline deploy verb and its exit codes, the GitHub Action's offline mode, the gh-driven CI/CD setup journey, verify-before-ready |
references/service.building-on-your-laptop.md |
A service on a LOCAL instance (Planton Desktop): the build cluster and its planton local build-cluster verbs and how to read each status line, the repository watch as why a laptop run starts, the sign-in as the only credential, the commit status (never a check), the desktop banner, the measured costs, every laptop failure sentence with its next step, what never to propose on a laptop |
references/service.reading-a-run.md |
Reading one run and reporting it in the user's words: build vs delivery shapes, status vocabulary, per-task errors, gates, mirrored external CI runs |
references/service.briefing-a-service.md |
"Brief me" on a service the person is looking at (standing context says Surface: a service's detail page), or "how is my service doing": the room's facts and what they save, the read order, attention-first shape, calibration, when to leave the records for the repository, and what each surface can do with the files |
references/service.build-failures.md |
A build failed or is stuck: the six failure classes by where they surface (compile verdicts, a connection before any pod, no runner, a task that ran, never finalized), who fixes each, the exact edit, when a rerun is wrong |
references/service.fixing-a-failed-run.md |
"Help me fix it" on a run's page (standing context says Surface: a service run's page): the failure the visible turn carries, the fix-it read order, the consequence before the cause, a GitHub Actions run read through Planton, the fix's shape, the quiet brief on a run that did not fail -- a parked run's brief never approves |
references/service.reading-a-repository.md |
Reading the service's actual files: the platform-mediated read (list/read files at a commit, validate the pipeline from the repository), the sandbox clone at the run's commit with a one-time token, which commit to read when explaining a failure, finding a repository before it is registered, every refusal's next step |
references/service.opening-a-pull-request.md |
A fix is known and the person wants it applied ("open the PR", "merge it"): the one write door -- show the exact files and the pull request's text, ask, then open it on a platform branch with the receipt; whether it builds on its own; merging only on the explicit ask, pinned to the head they saw; every refusal's next step |
references/service.managed-pipelines.md |
What a Planton-managed build runs: the platform tracks, the catalog tasks a repository pipeline reuses by plain name, the param contract and bindable workspaces, the platform-content pin, the compile verdicts, the images a build cluster pulls |
references/service.pipeline-authoring.md |
Writing or changing a service's own pipeline: the files, Tasks beside the pipeline, name resolution, the param contract and the optional trigger facts with when, the validate loop, every compile verdict's fix, and what to edit when asked for a step, a release-only step, or a shared task |
references/service.org-publishing.md |
Sharing a pipeline or a task across services: the TektonPipeline/TektonTask record shapes, the name law, publish order and the publish check, consuming by one line or a plain taskRef, what an update changes, the delete guards, listing what the organization published |
references/service.delivery-verbs.md |
Deploying an image built anywhere, promoting between environments, rolling back, tag releases, feature-branch deploys, explaining a refused delivery |
references/service.urls-and-rollout-verification.md |
Where a deployed service answers: URLs on the deployment record, reading the rollout verdict accurately |
references/service.pulling-private-images.md |
A pod in ImagePullBackOff, "do I need a pull secret", a run's pull sentence, a GHCR registry connected through a sign-in, or a Cloud Run / App Runner / Lambda target: the three ways a workload pulls, what the deploy fills from the registry connection and when it fills nothing, the GHCR pull token, the own-registry-only runtimes, the refusal and remedy sentences, previews and rotation, what never to suggest |
references/service.serving-domains.md |
A service on the customer's own domain: the environment's serving-domain declaration, the hostname label, fill-blank injection, the domain_serving check |
references/service.serving-domains-targets.md |
Per-target carrier truths (worker, ingress, HTTPRoute, Cloud Run domain mapping, ECS/ALB) and the remediation ladder for a failed domain_serving check |
references/service.serving-domains-custom.md |
Anything outside {label}.{env-domain}: apex, arbitrary FQDNs, multi-host, CDN fronting -- composed-infrastructure recipes with valueFrom bridges |
references/service.local-env-vars.md |
Running a service locally with real config (planton service env run|pull|check), dev flavors, .env.local layering |
references/service.configuring-deployments.md |
Reading and changing what a service is DECLARED to deploy: the two writers, the surgical get-then-apply loop, target environments, the deployments switch |
references/service.kustomize-authoring.md |
Moving a service's configuration into its repository (eject/init/checkout), the _kustomize tree conventions |
references/service.preview-environments.md |
Per-pull-request preview environments: the opt-in, the previews tree, the one-call preview read, teardown |
references/service.delete-cascade.md |
Retiring a service: the destroy-then-delete cascade, the retain-resources arm, the protected-environment refusal |
Self-hosted Planton (self-hosted.*)
| File | Read when |
|---|---|
references/self-hosted.reading-a-platform.md |
The Planton is self-hosted; reading the PlantonPlatform's phase, message, columns, and component sentences before any change; what never to touch |
references/self-hosted.front-doors-and-the-cli.md |
Pointing the CLI at a self-hosted Planton; whoami fails right after login; choosing Gateway API vs Ingress; the desktop's device sign-in |
references/self-hosted.upgrading.md |
Upgrading the operator or the platform; the CRD adoption preflight; the version floor; a preview-era install |
references/self-hosted.first-admin-and-seats.md |
Getting into a fresh install; "seats are all in use"; where the license key goes; keeping the local admin |
references/self-hosted.identity-connecting.md |
Connecting Entra ID, Okta, or Active Directory: the manifest, the dry-run, the verdicts, the first sign-in; tenant features not exercised |
references/self-hosted.identity-primary-and-break-glass.md |
Making the directory the only sign-in; /login?local=1, planton login --local; "what if Entra is down" |
references/self-hosted.identity-mapping.md |
Giving a directory group access; planton directory and the MCP tools; the blast-radius preview; reading sync health |
references/self-hosted.identity-offboarding.md |
How fast a departed person is out, per arm; the sync's laws; the email-less refusal; invited directory users; alert email |
Working craft (craft.*, catalog.*)
| File | Read when |
|---|---|
references/craft.discovery.md |
Starting a conversation; learning the person, their Planton, and the motive |
references/craft.personalization.md |
A profile fact sheet is present; shaping ANY explanation |
references/craft.profile-vocabulary.md |
Reading the fact sheet; what each Role/Goal/Team/Mode/Tool id means |
references/craft.planton-cli.md |
Looking up charts, projects, pipelines, connections; diagnosing failed deploys; the complete command map |
references/craft.cost-transparency.md |
The monthly cost picture from the catalog's verified estimates; honesty rules for money; saving levers |
references/craft.filing-platform-gaps.md |
Planton fell short of a need; filing the gap as a GitHub issue |
references/catalog.availability.md |
Which kinds an organization's catalog policy disables; the check-design-disclose law |
references/catalog.component-grounding.md |
Discovering kinds and reading component schemas; explain vs the catalog pack |