Skip to content

Document fingerprints as steering guidance#164

Closed
nahiyankhan wants to merge 461 commits into
mainfrom
codex/document-fingerprint-steering
Closed

Document fingerprints as steering guidance#164
nahiyankhan wants to merge 461 commits into
mainfrom
codex/document-fingerprint-steering

Conversation

@nahiyankhan

Copy link
Copy Markdown
Collaborator

Category: improvement
User Impact: Fingerprint authors get clearer guidance for writing fingerprints that steer generation and review instead of collecting style inventory.
Problem: The public docs and bundled agent recipes explain the fingerprint layers, but they did not explicitly teach authors how to turn those layers into generation decisions. That made it easier for future fingerprints to drift toward descriptive catalogs instead of durable steering guidance.
Solution: Add concise public and agent-facing guidance that frames fingerprints as decision engines: preserve goals, block anti-goals, resolve tradeoffs, route by situation, cite exemplars, and write patterns for selection, restraint, and review.

Validation:

  • pnpm check: passed via pre-commit
  • pnpm check:docs: passed, 3 docs OK
  • pnpm check:install-bundle: passed, 13 files OK
  • pnpm check:terminology: passed
  • git diff --check: passed
  • pnpm build: passed via pre-push
  • pnpm test: failed in packages/ghost/test/context-sandbox.test.ts on an existing compact Relay brief assertion expecting no ## Generated Cache section; reproduced separately and unrelated to these docs-only changes

Changeset: added patch changeset for @anarchitecture/ghost.

Ghost Review:

  • node packages/ghost/dist/bin.js check --base origin/main: passed, no active deterministic check failures
  • node packages/ghost/dist/bin.js review --base origin/main --include-memory: emitted advisory review packet for the docs/surface-model change
File changes

.changeset/steering-fingerprint-docs.md
Adds a patch changeset for user-facing fingerprint authoring docs.

apps/docs/src/content/docs/fingerprint-authoring.mdx
Adds an "Authoring For Steering" section after layer responsibilities, with a compact checklist for goals, anti-goals, tradeoffs, situations, principles, contracts, patterns, and exemplars.

docs/fingerprint-format.md
Adds a short format-reference note that high-quality layer content should make generation choices explicit.

packages/ghost/src/skill-bundle/references/capture.md
Adds a steering checklist to the capture recipe before agents write core layers.

packages/ghost/src/skill-bundle/references/patterns.md
Names the three useful jobs of a pattern: selection, restraint, and review.

Screenshots/Demos: N/A, docs-only change.

nahiyankhan and others added 30 commits April 27, 2026 10:36
…ed_files

- inventory: workspace expansion (package.json workspaces + apps/packages/libs/common one-level)
- inventory: build_system_hints alongside platform_hints (informational)
- map schema: platform and build_system accept arrays
- map schema: build_system enum extended (style-dictionary, maven, sbt, cmake)
- map schema: design_system.token_source (inline | external | mixed) + upstream ref
- map schema: design_system.derived_files alongside entry_files; entry_files now optional
- map lint: design-system-files-missing / upstream-missing / upstream-stranded soft checks
- expression: relax unused-palette to count role-binding citations (palette field hexes + inline hex citations in evidence strings)
- expression: shadowComplexity enum rename (none → deliberate-none) — breaking
- fleet: compute/types/cli updated to handle array-shape platform/build_system
- ghost-ui/map.md: declare token_source: inline (system ships its own tokens)

Tests: 254 passing (+20 over the 234 baseline). New fixtures:
workspace-repo, multi-platform-repo, external-tokens-repo, derived-tokens-repo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* phase-4b-schema-enrichment:
  feat(map,expression): Phase 4b — schema arrays + token_source + derived_files
- detect repo kind from map.md frontmatter (token_source, registry, composition)
- ui-library mode (default, current guidance)
- token-pipeline mode (sample at layer level, not component)
- consumer mode (record what's internalized from upstream)
- library-mode feature_areas heuristic (component categories / token layers)
- reaffirm Phase 0 module-suffix decision; texture stays in Topology prose

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* phase-4c-recipe-branching:
  docs(expression): Phase 4c — branch profile recipe by repo kind
- skill-bundle schema.md: evidence is body, not frontmatter (Phase 4a missed
  this LLM-facing copy — agents following the profile recipe were hitting 10
  schema errors on first lint because the condensed reference still showed
  `decisions[].evidence:` as a frontmatter array).
- profile.md Step 5: explicit "evidence body-only" note so the recipe surfaces
  the constraint inline rather than relying on the schema reference.
- unused-palette: slug-binding propagation now actually works. A role binding
  like `roles[].tokens.palette.background = "{palette.dominant.primary}"` now
  resolves the reference and marks the underlying hex as cited. The 4b CHANGELOG
  claimed this but the code only checked literal hexes; multiple validation
  agents flagged the gap. Also widens role-palette literal collection to any
  slot key (preparing for Phase 5b's open-ended slot vocabulary).
- platform_hints: drop build-system / language / runtime leaks. The hint set
  is now constrained to the Platform enum (web/ios/android/desktop/flutter/
  mixed/other). `bazel` lives in build_system_hints only; `ruby`, `python`,
  `rust`, `go`, `jvm`, `php`, `elixir` no longer surface as platforms (they
  weren't valid platform values anyway). Adds a bazel-ruby-ios fixture
  modeled on real iOS monorepos that hit this leak.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- build_system enum: add vite, webpack, parcel, rollup, turbopack, esbuild,
  nx, turbo. Real consumer repos use Vite + pnpm + Nx; without these the
  recipe was forced to drop signal into prose. inventory.ts also detects
  these via a new BUILD_TOOL_MATCHERS table (config-file basename matching).

- design_system.upstream: accepts string | string[]. Consumers that pull
  from a fan-out of upstream packages (tokens + components + icons + glue)
  can now express that structurally instead of packing them into prose.

- roles[].tokens.palette: open-ended slot vocabulary. Was a strict three-key
  object (background/foreground/border) with `unknown keys reject`; now a
  Record<string, string>. Conventional vocabulary documented in schema.md
  and expression-format.md (background, foreground, surface, border,
  accent, muted, link); richer slot names (ring, popover, separator, …)
  no longer hard-error.

- broken-role-reference: accept opaque external token refs. Style-Dictionary-
  style consumer expressions can bind role slots to upstream tokens like
  `{base.color.brand.x.light}` without the linter rejecting them. Local refs
  (`{palette.dominant.X}` / `{palette.semantic.X}`) still validate; refs
  with recognized external heads (base/core/semantic/component/tokens/ref/
  sys) or 4+ dotted segments pass through as opaque.

- Tests: vite-nx-repo and multi-upstream-repo fixtures cover detection and
  lint paths; expression-side tests cover extended slot keys and external
  refs (262 tests, +5 since Phase 5a).

All changes are additive — existing valid map.md and expression.md files
keep validating. ghost-ui/{map.md,expression.md} continue to lint clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…on notes

Two prose-only clarifications surfaced by the second-round real-repo
validation:

- profile.md Step 1.5: token-pipeline takes precedence over both
  ui-library AND multi-platform when signals overlap. Pipelines often
  span multiple platforms by definition; the pipeline branch handles
  per-platform sinks via feature_areas. Prevents agents re-reading the
  rule order to be sure.
- ghost-map.md composition.styling row: for token-pipeline repos where
  the source is JSON/YAML and no rendering style is "primary," list
  output styles ordered source-style-first. Prevents fabrication when
  the standard "first is primary" rule doesn't fit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Companion to 0983acd — the second polish edit lost the race to a
linter on the first attempt. For token-pipeline repos where the
source-of-truth is JSON/YAML and no rendering style is "primary,"
list output styles ordered source-style-first. Prevents fabrication
when the standard "first is primary" rule doesn't fit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Workspace packages (@ghost/core, ghost-expression, ghost-drift,
ghost-fleet, ghost-map) declare their main/module/exports as
./dist/...; vite/vitest cannot resolve those entry points on a fresh
runner where dist/ does not exist. Locally tests pass because dist is
left over from prior development; pre-push runs build/test/check in
parallel so it doesn't trip there either. CI from a clean checkout
hits "Failed to resolve entry for package @ghost/core" on every
cross-package import.

Adding pnpm build before pnpm test in the test job. The lint job
already builds incidentally via pnpm typecheck (tsc --build) inside
pnpm check.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Decompose ghost into five decentralized tools (Phase 1–5)
Rewrites the cross-cutting docs to match the post-PR-#64 reality where
Ghost is five tools (ghost-map, ghost-expression, ghost-drift,
ghost-fleet, ghost-ui) instead of one. CLI verbs are scoped to the
tool that owns the artifact; per-tool skill bundles replace the single
ghost-drift bundle.

Content:
- CLAUDE.md, root README, and ghost-drift README rewritten around the
  five-tool surface; new packages/ghost-expression/README for the
  intended-public sibling.
- docs/generation-loop.md updates context-bundle invocations to
  ghost-expression; expression-format.md drops the dropped-from-scope
  generate recipe.

Docs site:
- /tools is now a five-card index. Each tool gets a /tools/<name>
  landing (hooking ghost-ui through to its existing /ui catalogue).
- Cross-tool guides (Getting Started, CLI Reference) move from
  /tools/drift/* to /docs/* via a new "guide" frontmatter section.
- Old /tools/drift/{getting-started,cli} URLs redirect to /docs/*.
- Dock command palette restructured into Tools + Docs groups.
- Home thesis softened from drift-centric framing; teases the
  elevation lens / world-model concept that ghost-fleet operationalizes.

Tooling:
- scripts/dump-cli-help.mjs walks all four CLIs (drift, expression,
  map, fleet); manifest now keyed by tool with each command carrying
  its tool prefix.
- <CliHelp> takes a `tool` prop and renders the correct prefix.
- check-docs-frontmatter accepts the new "guide" section and updated
  known-routes list.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
docs: align docs site IA with five-tool decomposition
Pulls the Working with Ghost narrative out from the buried
/tools/drift/workflow URL and onto the /tools landing page itself,
behind a compact 5-card tool strip. Adds Step 01 · Map (write a
map.md) before the existing Profile step so the workflow opens with
ghost-map, and renumbers the rest. Drift Workflow nav entries
(/docs index card and ⌘K palette) repoint to /tools; old
/tools/drift/{workflow,concepts} URLs redirect.

Also extends HistoryRibbon (Step 05 · Evolve) with an interactive
playhead — drag to set a decision moment, pick a hypothetical
stance, and the curve re-classifies forward of the playhead.
Demonstrates the "the curve hasn't changed shape — but the meaning
of every point after has" line that the page used to only assert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
docs: promote workflow to /tools hero, add Map step
…ming

Across CLAUDE.md, README, docs site, skill bundles, and map.md, reframe
Ghost as the design-language layer agents reach into when the UI they
generate drifts. The "deterministic CLI + judgement in skills" dichotomy
stays in INVARIANTS §1/§4 as the underlying constraint, not the headline.

Architecture is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
docs: lead with the agent, demote deterministic-CLI from headline framing
…st-map

Land the bucket pipeline and consolidate to a four-tool topology. A scan
now runs in three stages — topology (map.md) → objective (bucket.json) →
subjective (expression.md) — all owned by ghost-expression.

ghost.bucket/v1: new artifact catalogues every concrete design value with
structured specs, occurrence counts, and deterministic content-hashed IDs.
Schema, lint, merge, and fix-ids primitives live in @ghost/core.

New ghost-expression verbs:
- inventory [path] — raw repo signals JSON (migrated from ghost-map).
- lint [file] — auto-detects expression.md / map.md / bucket.json.
- bucket merge — deterministic concat with id-based dedup, idempotent.
- bucket fix-ids — recompute row IDs from content; lets surveyor agents
  author rows with empty id fields and finalize in one pass.
- scan-status [dir] — report per-stage state and recommended next stage.

New skill recipes (ghost-expression bundle):
- map.md — topology stage (migrated from ghost-map skill recipe).
- survey.md — objective stage. LLM-driven extraction with dialect-specific
  grep strategies, exhaustiveness discipline, saturation predicate.
- scan.md — meta-recipe orchestrating topology → survey → profile.
Refactored: profile.md is now strictly the subjective interpretation
stage (reads bucket.json as ground truth; cannot fabricate values).

ghost-map package deleted. ghost.map/v1 schema/types moved to @ghost/core;
inventory + lint moved to ghost-expression. ghost-fleet now imports map
types from @ghost/core. CLAUDE.md, README.md, and docs IA updated to
reflect the four-tool topology.

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

Self-distance reported 17.5% on freshly authored expressions because
loadExpression never backfilled `oklch` on hex-only palette colors.
comparePalette then treated every color as fully unmatched and contributed
distance 1.0 per color even when comparing an expression to itself.

Two-layer fix:
- loadExpression now backfills oklch deterministically (parseColorToOklch
  is pure: same hex → same oklch), so re-parsing produces identical
  in-memory shapes.
- comparePalette resolves oklch on-the-fly when missing and falls back to
  hex-string equality for non-parseable values (CSS vars, opaque refs).
  Defensive against third-party producers that emit hex-only.

Survey recipe tightened with a load-bearing exhaustiveness rule. Triggered
by a dogfood scan that produced ~10% recall on components (6 rows for a
97-component package). The rule is repo-agnostic: the agent identifies the
canonical signal in this repo, enumerates exhaustively, and cross-checks
counts. Recipe explicitly forbids sampling and placeholder/glob library
names. Coverage check (step 8) is now a real gate — exhaustiveness must
match independent counts before declaring saturation.

Pinned attempt-1 artifacts under dogfood/ghost-ui/attempt-1/ with a
structured NOTES.md documenting the failure modes. Future attempts go
alongside so we can track improvement.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
External libraries (icon sets, primitive collections, motion libs, charting) no longer have a top-level bucket section. Whether a system uses Radix or hand-rolls primitives doesn't change what its design language *is*; what matters surfaces elsewhere — font families show up as typography tokens, and load-bearing library choices (icon family, font sourcing) belong in interpreter prose under the relevant decision dimension.

Bucket sections are now: values, tokens, components.

Removed from @ghost/core exports: LibraryRow, LibraryRowSchema, libraryRowId. Lint, merge, and fix-ids no longer touch a libraries section. Skill recipes (survey.md, profile.md) updated — survey.md no longer instructs the agent to enumerate libraries; profile.md tells the agent that load-bearing library choices land in prose, not as structured rows.

zod schema stays non-strict, so historical buckets that still carry a libraries field continue to lint clean (the field is simply ignored).

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

Six documentation files were carrying stale framing from the five-tool era
or hadn't been updated for the bucket pipeline / libraries-cut.

- packages/ghost-expression/README.md: full rewrite. Was framed around
  "four verbs" (lint/describe/diff/emit) with no mention of the scan
  pipeline. Now leads with the three-stage table (topology → objective →
  subjective), enumerates all seven verbs (inventory, scan-status, lint,
  describe, diff, bucket, emit), and points at all four skill recipes
  (scan, map, survey, profile).

- packages/ghost-drift/README.md: dropped "five-tool decomposition" and
  the ghost-map reference. The "Authoring expression.md?" sidebar now
  surfaces inventory + scan-status + bucket merge alongside the existing
  lint/describe/diff/emit verbs.

- CLAUDE.md / AGENTS.md (symlinked): bucket description no longer mentions
  "and libraries", scan-status added to the verbs table, scan recipe
  added to the workflows list.

- apps/docs/src/content/docs/cli-reference.mdx: added scan-status and
  bucket sections under ghost-expression. Updated overview to seventeen
  verbs and added the scan recipe to the skill-recipes table.

- apps/docs/src/content/docs/getting-started.mdx: tools table grew to
  include scan-status, added a three-stage diagram, replaced the
  single-step "Profile Your First System" with a stage-aware "Scan Your
  First System" walkthrough.

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

Slot → token bindings either fall out of decisions[] (pattern consequences) or
live in bucket.json components[] (exhaustive catalog). The hybrid roles[]
slot was filling neither cleanly, didn't scale to systems with many components,
and the schema never committed on whether it was exemplary or exhaustive.

Removes roles[] from the zod schema (.strict() now rejects it), Expression
type, lint (broken-role-reference rule, slug-binding propagation, and the
references.ts token resolver), profile/scan/schema/verify/review recipes,
expression.template.md, the docs site, and every fixture (arcade, market,
ghost-ui, fleet members, .scratch). unused-palette is simplified to check
decision evidence/prose only.

Also: ignore .scratch/ for dogfood scans, and ship the ghost-ui
expression-fidelity test bundles (arcade + market) as new fixtures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Free-form `decisions[].dimension` slugs fragment fleet aggregation —
ghost-ui's `color-strategy` and a Cash app's `color-system` describe
the same axis under different names, and N-way overlap on incidentally
shared labels is not a basis for cross-system distance.

Add a 12-slug controlled list in `@ghost/core` (color-strategy,
surface-hierarchy, shape-language, typography-voice, spatial-system,
density, motion, elevation, theming-architecture, interactive-patterns,
token-architecture, font-sourcing) plus `closestCanonical()` and
`resolveDecisionKind()` helpers. The frontmatter schema accepts an
optional `dimension_kind` on `decisions[]` as the escape hatch for
genuinely novel decisions, which fleet-aggregation primitives use to
roll up by canonical bucket. New soft `non-canonical-dimension` lint
warning suggests the closest match without rejecting authoring freedom.

Validated against every expression.md in the repo: the ghost-ui
reference is 11/11 canonical with zero warnings; across 9 expressions,
47 of 64 decisions land canonical, and the matcher resolves 4 of the
remaining 17 to a clear suggestion (`theming` → `theming-architecture`,
`shadow-hierarchy` → `elevation`, `semantic-density` → `density`,
`product-area-color-coding` → `color-strategy`).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Introduces the perceptual prior — Ghost's opinionated stance that drift
severity should track how loudly a change registers visually, not just
whether it deviates from a recorded value.

Three perceptual tiers fix membership for each canonical dimension:
loud (color-strategy, font-sourcing → critical), structural (shape,
elevation, surface, interactive, typography-voice → serious), and
rhythmic (spatial-system, density, motion, theming, token → nit).
Match shape is per-RuleKind: color is exact, spacing is band (±2px),
type-size is percent (±10%), radius and shadow are structural.
Presence/absence escalation lifts a rule one tier when bucket count for
its dimension is at or below presence_floor — sparsity is a design
decision, and adding to a silent dimension is the loudest possible
change.

Adds Rule, RuleKind, RuleMatchShape, DriftSeverity types alongside
existing Decision (additive — nothing removed). Expression.rules is
optional. Exports computeRuleSeverity, resolveMatchShape,
resolveTolerance, escalateForPresence as the helpers a v0 emitter
threads the prior through. 35 new tests cover tier coverage, severity
mapping, escalation boundaries, match defaults, and tolerance defaults.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds install/install.sh + install/manifest.json so the Ghost design-
language scan + emit recipes can be installed without npm or a build
step:

    curl -fsSL https://raw.githubusercontent.com/block/ghost/main/install/install.sh | sh

The installer detects the host agent (claude / cursor / codex /
opencode), validates input up-front, fetches the manifest-listed files
under packages/ghost-expression/src/skill-bundle/, and lays them down
under the agent's skills directory (e.g. ~/.claude/skills/ghost/).
Idempotent — refuses to overwrite without --force. Supports
--source <url> for testing against a local mirror or a release fork.
~200 lines of POSIX sh; no Node, no jq dependency. Smoke-tested for
auto-detect, explicit agent, force-reinstall, bad-agent rejection,
and --help.

Pairs with the prose fallbacks already added to scan.md / map.md /
profile.md — the no-CLI install path is real, not degraded.

Also includes the v0 changeset (rules[] + perceptual prior +
curl-install) describing this branch's user-facing impact.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Trim the unreleased Rule type before it ships. The field added churn
without earning its keep — re-scan verification can be done by
re-grepping the bucket against the rule's pattern, no per-rule citation
list required. Also keeps the YAML lighter for hand-authors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pair packages/ghost-ui/expression.md with its bucket.json so the
reference design system carries both stage-2 and stage-3 artifacts
side-by-side, like a real consumer would. Earlier dogfood/* attempts
remain as the rough drafts; this is the keeper, scanned at 8196f55.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
INVARIANTS.md §3 named Character, Signature, and decision rationale as
the body's prose layer. Signature is no longer load-bearing — every
claim it carried is covered better by rules[] (with presence_floor for
absences), decision evidence, or palette/spacing/typography/surfaces
frontmatter — and the section had collapsed into restating other parts
of the artifact.

This is the invariant amendment per INVARIANTS.md's own preamble. The
schema, parser, writer, recipe, template, and existing artifact changes
ship as the next commit (major bump on ghost-expression).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Major bump on ghost-expression. The `# Signature` body section and
`observation.distinctiveTraits` field are removed from the canonical
expression.md schema:

- DesignObservation.distinctiveTraits removed from @ghost/core
- writer no longer emits `# Signature`; lint no longer expects it
- parser silently ignores legacy `# Signature` blocks in older
  expression.md files (graceful migration for downstream consumers)
- profile.md recipe: absences are now codified as rules with
  presence_floor instead of Signature prose
- schema.md / expression-format.md / template / docs site / SKILL.md
  files all updated
- 9 in-repo expression.md files (ghost-ui, fleet fixtures, fidelity
  bundles, dogfood/ghost-ui) rewritten via scripts/strip-signature.mjs
- context-bundle emit uses observation.personality for the trait-phrase
  hooks where it previously used distinctiveTraits

INVARIANTS.md §3 amended in the prior commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tailwind targets render most of their design language from class atoms
(`p-2`, `bg-orange-500`, `text-sm`) that consume framework defaults —
the spacing scale is `N * --spacing` (4px-base) by default, with most
N values never declared as `--spacing-N` tokens in `@theme {}`. A
bucket built from declarations alone undercounts the rendered scale
systematically and produces an irregular `expression.spacing.scale`
even when the live UI sits on a clean modular grid.

Surfaced by the ghost-ui dogfood at edc0913: declarations-only pass
produced spacing scale [20, 32, 44, 52, 75, 100], baseUnit null,
regularity 0.5 — vs. the canonical (curated) [2, 4, 6, 8, 12, 16, 20,
24, 32, 36, 40, 52, 75, 100], baseUnit 4. Resolving the actually-used
class atoms (`rg -oN '\bp[lrtbxy]?-N\b' | resolve to N*4px`) recovers
13 of the 14 canonical values at occurrence floor 2.

Adds a `## Tailwind class-atom pass` section between extraction step 2
and step 3 spelling out:

- the v4 atom-to-literal resolver (calculated from `--spacing`,
  overrideable per N via `--spacing-N` declarations)
- the v3 fallback (read `theme.*` from `tailwind.config.{ts,js}`)
- the procedure: grep atoms, resolve to literals, record as
  `values[]` rows with `usage.className`, plus tokens[] rows for the
  Tailwind defaults consumed
- merge-on-collision behavior when a literal comes from both a
  declared token and class-atom usage

Existing `bucket-gen.mjs` generators in dogfood/* don't implement the
pass yet — they still produce declarations-only buckets. A follow-up
attempt-4 would re-validate end-to-end.
chailandau and others added 26 commits June 17, 2026 09:59
Mirror block/sessh: after publishing the release tarball, mint a scoped
GitHub App token for block/homebrew-tap and dispatch its bump-formula.yaml
so each anarchitecture-ghost@X.Y.Z release auto-opens a formula bump PR.

Gated on BLOCK_HOMEBREW_TAP_APP_ID so forks/unconfigured repos skip it.
Move the tap-bump from the now dispatch-only release-tarball.yml onto
release.yml's automatic publish path, so brew install block/tap/ghost
tracks every npm release. Gated on an actual Changesets publish and the
BLOCK_HOMEBREW_TAP_* secrets.
* main:
  chore: version packages
  ci: fix GitHub release tarballs
chore: auto-bump Homebrew tap on release
Package release tarballs with dependencies
…-loop-contract

Add Ghost drift loop contract
@nahiyankhan nahiyankhan force-pushed the codex/document-fingerprint-steering branch from 82d1c05 to dcc603a Compare June 23, 2026 03:40
@nahiyankhan

Copy link
Copy Markdown
Collaborator Author

Recreated as #169 (this PR was auto-closed by GitHub during a repo history rewrite that removed the dogfood/ directory). All work preserved on the same branch.

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.

4 participants