Skip to content

Move operator-specific house style out of shipped defaults - #34

Open
clsandoval wants to merge 1 commit into
mainfrom
feat/tenant-skills-out-of-defaults
Open

Move operator-specific house style out of shipped defaults#34
clsandoval wants to merge 1 commit into
mainfrom
feat/tenant-skills-out-of-defaults

Conversation

@clsandoval

Copy link
Copy Markdown
Collaborator

Problem

defaults/ is the product. Every operator who deploys daimon inherits it. But defaults/skills/pymc-artifact-style/ encoded one consultancy's brand palette, type system and document conventions — so a fresh deployment silently rendered charts in someone else's brand colours.

That is a product defect independent of the fact that it also put that material in a public repo.

Fix

Tenant-specific skills already have their own delivery path: repo binding. A push webhook syncs a bound repo's SKILL.md directories onto the agent via the user_skills ledger, which is separate from the daimon_managed=true sweep, so the two paths do not collide.

The skill has been landed in the private tenant skill repo first. This PR removes the public copy and detaches it from the seeded agent in defaults/agents/daimon.yaml.

Ordering matters and has been respected: the sweep archives any managed resource absent from defaults/, so removing it here takes it off the agent on the next defaults apply. It exists on the tenant-repo path before this merges.

Lint

Two gaps closed in scripts/lint_designators.sh:

  • defaults/ was never in TREES. It ships in this repo like every other tree. The removed skill had been naming private repos for months without tripping anything.
  • New tenant-branding-in-defaults rule so the next operator-specific skill cannot land here.

Scoped to defaults/ deliberately: marimo_notebooks and marimo_blog reference the lowercase pymc library as a runtime fact ("the runtime ships PyMC 5.x and ArviZ 0.x (pinned)", --with pymc --with arviz). That is true for any operator and stays. The rule matches the brand hexes, Archivo, and PyMC Labs — the company name, capitalised, which is distinct from the library.

report() takes an optional fourth argument to scope a rule to one tree.

Verified both directions — injecting PyMC Labs palette #0C1F40 with Archivo Expanded into a probe skill exits 1 and names the file; removing it exits 0.

Not covered

Existing installs already carrying the skill are healed by the sweep on the next defaults apply, not by this merge.

…product

`defaults/` is what every operator inherits when they deploy daimon, not one
operator's configuration. `pymc-artifact-style` encoded a specific consultancy's
brand palette, type system and document conventions, so any operator standing up
their own deployment silently got someone else's branding as their house style.

Tenant-specific skills already have a delivery path that `defaults/` is not:
repo binding, where a push webhook syncs a bound repo's skill directories onto
the agent through the `user_skills` ledger. That ledger is separate from the
`daimon_managed=true` sweep, so the two paths do not collide. The skill has been
landed in the private tenant repo first; this removes the public copy and
detaches it from the seeded agent.

Also closes two gaps in the leakage lint:

- `defaults/` was never scanned. It ships in this repo like any other tree, and
  the removed skill had been naming private repos for months without tripping
  anything.
- adds a `tenant-branding-in-defaults` rule so the next operator-specific skill
  cannot land here. Matches the brand hexes, "PyMC Labs" (the company, distinct
  from the lowercase library) and Archivo, scoped to `defaults/` only — the
  notebook skills legitimately reference the pymc library as a runtime fact and
  must keep doing so.

`report()` grows an optional fourth argument to scope a rule to one tree.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant