Registry Baseline Grill Log
Registry Baseline Grill Log
Durable decision record for replacing the manifest-driven hi scaffold, update,
and check flow with a registry-based Baseline. Q1 to Q13 record decisions the
user made during the brainstorm on 2026-09-27 before this grill opened. Later
entries record grill rounds. Ids are stable; a changed decision gets a new
superseding entry.
Branch A: Registry as Baseline distributor
Q1
Prerequisites:
- none
Evidence anchor:
apps/cli/src/baseline/resolve.ts:512-580(bundled, local, control-plane resolution order)packages/contract/src/baseline.ts:289-303(resolve,artifact,promoteendpoints)apps/api/src/baseline-registry.ts:366-420(durable promotion store)
Observed constraint:
- Nine issues (43, 49, 50, 55, 62, 63, 91, 94, 143) come from Baseline resolution and authority across three sources and a promotion step.
Question: What distributes the Baseline?
Accepted answer:
- A registry in the shadcn registry format is the only Baseline distributor. GitHub release artifacts and the control-plane promotion path stop.
- The registry is also the source for drift management.
Code consequence:
- The
baselineHTTP API group, the archive digest pipeline, and the verified baseline cache are retired or replaced by registry fetches.
Q2
Prerequisites:
- Q1
Evidence anchor:
apps/cli/src/scaffold/managed-lint-generation.ts:157-266(per-workspace render inputs)apps/cli/src/scaffold/output.ts:2386,2418,2680(prompt spec, subagent spec, workspace prompt renders)
Observed constraint:
- Built Managed Artifacts depend on repository shape. Without the shape used at install time, a Drift check cannot separate a local edit from a shape change.
Question: How does the Drift check tell a local edit from a repository shape change on a built Managed Artifact?
Accepted answer:
- The installer records the install-time repository shape (workspace paths, Pack ids, detected technologies) in Project settings. The Drift check re-renders at the installed version with that recorded shape.
Code consequence:
- The installed record carries a Recorded Shape. No output hash is stored.
Q3
Prerequisites:
- Q1
Evidence anchor:
.claude/agents/packages-db.md,.cursor/agents/packages-db.md,.opencode/agents/packages-db.md,.codex/agents/packages-db.toml(byte-identical body, different envelope).agents/scripts/sync-subagents.mjs(3,265 lines; also writes the manifest)
Observed constraint:
- One authored manifest produces 88 files through a shipped script that is a second writer of CLI state (#105).
Question: Who produces the per-harness subagent files?
Accepted answer:
- The
hiCLI builds each subagent body once from.agents/subagents/manifest.mjsand wraps it in each harness envelope through a Harness adapter.sync-subagents.mjsand.agents/scripts/harness-projection/*are removed.
Code consequence:
- Harness adapters are installer code, not consumer-repository scripts. One writer for all built files.
Q4
Prerequisites:
- Q1
Evidence anchor:
- shadcn
packages/shadcn/src/utils/updaters/update-files.ts:144-260(overwrite prompt ignores--yes) - shadcn
packages/shadcn/src/registry/resolver.ts:148-400(resolver under 400 lines)
Observed constraint:
- shadcn writes content files only, prompts on existing files even with
--yes, merges only.env, and installs dependencies at one directory.
Question:
Does hi depend on the shadcn package or carry its own installer?
Accepted answer:
hicarries its own small installer. Registry item JSON stays byte-compatible with the shadcn schema sonpx shadcn addandshadcn mcpremain fallbacks.
Code consequence:
- Extensions live under item
meta: symlinks, structured merges, workspace dependencies, templates with declared inputs.
Q5
Prerequisites:
- none
Evidence anchor:
apps/cli/src/data/scripts/managed-lint-runner.mjs:225-230(maxBuffer10 MiB)apps/cli/src/data/scripts/commit-gate-runner.mjs:32-36,59-62,163-238
Observed constraint:
- Issue #232: 13.5 MB of oxlint JSON overflows the buffer; the full owner file
set is inlined into one shell string and an env var, exceeding
ARG_MAX.
Question: When is issue #232 fixed?
Accepted answer:
- Inside the release that ships the registry implementation, not before.
Code consequence:
- The lint runner and commit-gate runner are registry items in that release; the fix ships with them.
Q6
Prerequisites:
- Q1
Evidence anchor:
.agents/hooks/scaffold-update-check.mjs:140-151(keys ondrift-detected, never emitted)apps/cli/src/features/repository-check/application.ts:592-597(forced stable refetch)
Observed constraint:
- Session start runs a network-bound full check whose drift branch is dead.
Question: What does the session-start hook check?
Accepted answer:
- The hook stays. It checks the Baseline version only: is a newer registry version available than the installed one. It does not run the full drift comparison.
Code consequence:
hi checkfetches the catalog and compares versions; full comparison ishi diffon demand.
Q7
Prerequisites:
- none
Evidence anchor:
apps/cli/src/data/catalog/lint.ts(typescript-anti-slopasset,sourceFilescopied per workspace).devpunks/scaffold-manifest.json(13 workspace copies ofLICENSEandindex.mjs)
Question: Does the anti-slop lint asset stay a default, and where do its files live?
Accepted answer:
- Anti-slop rules stay the default lint asset for TypeScript Software Scopes.
- Its files stay scoped to each app and package, like the per-package lint rules. Per-workspace copies remain.
Q8
Prerequisites:
- Q1
Question: Where is the registry hosted?
Accepted answer:
- With the existing HI API on Vercel. "Whatever is easiest." The exact mount,
static files or an
apps/apiroute, is delivery detail.
Q9
Prerequisites:
- Q1, Q2
Question:
Do prompt specs, AGENT-HANDOFF.md, and AGENT-SYSTEM-PROMPT.md stay tracked
files or become on-demand output?
Accepted answer:
- They stay tracked Managed Artifacts. They are tied to the Baseline and are built from registry templates with the Recorded Shape.
Q10
Prerequisites:
- Q1
Evidence anchor:
apps/cli/src/baseline/bundled.ts:169-203(bundled digest verification)- Issue #43 (stale bundled Baseline applied by mistake)
Question: Does a bundled offline Baseline stay inside the npm package?
Accepted answer:
- No. The bundled fallback is dropped. The registry is the only source.
Code consequence:
hi initneeds network access and registry credentials.
Q11
Prerequisites:
- Q1, Q8
Evidence anchor:
apps/cli/src/control-plane/client.ts:53-60(optional headers, no credential source)apps/api/src/baseline-registry.ts:127-161(server-side GitHub token for release inventory)
Observed constraint:
- The CLI sends no credential to the control plane today. The API holds a
GitHub token server-side to read release assets. No
hi loginexists inapps/cli/src/cli/.
Question: Does the registry require credentials?
Accepted answer:
- Yes. The user's stated premise was that Baseline access is already limited to a CLI with its login. Code shows no such login; the credential mechanism is an open question (Q19).
Q12
Prerequisites:
- Q3
Question: When are the per-harness subagent files rebuilt?
Accepted answer:
- Only by
hi updateandhi diff. The edit hook does not rebuild them.
Q13
Prerequisites:
- Q1
Evidence anchor:
.devpunks/scaffold-manifest.jsonmanagedDependencies(105 pins across 13 workspaces)- shadcn never removes dependencies (absence in
packages/shadcn/src)
Question: What happens to a devDependency that is no longer required by any installed lint asset?
Accepted answer:
hi updateremoves it from the workspacepackage.json. The user accepted this with the stated risk that a project may use the same package directly. A guard is asked in Q26.
Round 1 (2026-09-27)
The user agreed to every R1 recommendation except Q19, Q27, Q30, and Q31.
Q14
Prerequisites:
- Q1
Question: What identifies a registry version?
Accepted answer:
- The existing Baseline version format
YYYY.MM.DD-<short sha>, for example2026.09.15-1ee7f8b7.
Q15
Prerequisites:
- Q1, Q14
Evidence anchor:
packages/contract/src/baseline.ts:303(promoteendpoint)- Issues 49, 91, 94 (promotion and authority failures)
Observed constraint:
- A separate promotion step made the CLI depend on server-side state that was stale or unavailable.
Question:
Is there one latest pointer or a promotion step?
Accepted answer:
- One
latestpointer in the catalog that moves on publish. No promotion step.
Code consequence:
- The
promoteendpoint and the durable promotion store are retired.
Q16
Prerequisites:
- Q1, Q15
Evidence anchor:
.github/workflows/release.yml;apps/cli/scripts/publish-baseline.mjs;apps/cli/scripts/classify-release-impact.mjs
Question: What builds and publishes the registry, and which changelog selects it?
Accepted answer:
- The existing release workflow builds the registry from
apps/cli/skillsandapps/cli/src/dataand publishes it.BASELINE_CHANGELOG.mdstays the product selector. Theskillsrepository stays the source of truth through the existing sync.
Q17
Prerequisites:
- Q14
Evidence anchor:
apps/cli/src/baseline/compatibility-range.mjs; session check output "Baseline requires CLI >=5.2.2 <5.3.0"
Question: Does a registry version declare a compatible CLI range?
Accepted answer:
- Yes. The CLI refuses a registry version outside its range and tells the user to upgrade.
Q18
Prerequisites:
- Q1
Question: Does the catalog carry a per-item content hash?
Accepted answer:
- Yes, a sha256 per item, used only to verify the download cache. Never used for repository drift.
Q19
Prerequisites:
- Q11
Evidence anchor:
apps/cli/src/control-plane/client.ts:53-60(no credential source)apps/api/src/baseline-registry.ts:127-161(server-side GitHub token only)
Observed constraint:
- No CLI login exists. A registry credential would be a new mechanism.
Question: Which credential mechanism does the registry use?
Accepted answer:
- None. The registry stays public. No credential mechanism is introduced.
- This supersedes Q11.
Code consequence:
- No
hi login, noregistriesheaders, no token storage.hi initneeds network access only.
Q20
Prerequisites:
- Q2
Evidence anchor:
.agents/hooks/format-edited-file.mjs:374-393;apps/cli/src/features/project-settings/service.ts:464-530
Question: Is local state two files, one writer each?
Accepted answer:
- Yes.
settings.jsonholds intent and is edited by a human, or by the agent on request.installed.jsonholds the installed Baseline version, the Recorded Shape, and the item-to-path map; only the installer writes it.
Code consequence:
- The edit hook and stale detection read
installed.json. No hashes anywhere.
Q21
Prerequisites:
- Q20
Evidence anchor:
.agents/hooks/format-edited-file.mjs:873-881,1158-1165; issue 231
Question: What does the edit hook do when the Installed Record is missing?
Accepted answer:
- It treats the repository as having nothing managed and does not block edits.
hi checkreports "not installed".
Q22
Prerequisites:
- Q1
Evidence anchor:
apps/cli/src/update/run.ts:818-827(hasActionablePackDrift); issues 50, 62
Question: Are selected Packs explicit in settings, with detection as proposal only?
Accepted answer:
- Yes. Settings lists selected Packs. Detection runs at
hi initand on request and only proposes. A detected but unselected Pack is information, never drift.
Q23
Prerequisites:
- Q1
Evidence anchor:
apps/cli/src/update/run.ts:6417-6456(pending marker),6473-6550(apply order)
Question: What is the apply order?
Accepted answer:
- Plan; validate that every merge target parses; write files; apply merges; create symlinks; install workspace dependencies; write the Installed Record last. No pending-publication marker.
Code consequence:
- A re-run after any failure converges by content compare.
Q24
Prerequisites:
- Q1
Question: What does a non-interactive update do on a Copied Artifact conflict?
Accepted answer:
- With
--yes, it overwrites the Copied Artifact and reports the path. Git keeps the local version. Authored Artifacts are never overwritten.
Q25
Prerequisites:
- Q1
Question: How are text files compared?
Accepted answer:
- Normalize line endings and trailing whitespace only. No formatter-aware comparison.
Q26
Prerequisites:
- Q13
Question: What guard applies before removing a stale devDependency?
Accepted answer:
- Remove only when no first-party source file in that workspace imports the package. Otherwise report and keep.
Q27
Prerequisites:
- Q4
Evidence anchor:
- Issue 58 (Windows
fs.symlinkEPERM); today's receiptcopyFallbacks
Question: What happens when a symlink cannot be created?
Accepted answer:
- No copy fallback. The installer reports the failed symlink and its intended
target to the user so it can be fixed later. The Drift Check reports it as
link-faileduntil it exists;hi updateretries on every run.
Q28
Prerequisites:
- Q5
Evidence anchor:
apps/cli/src/data/scripts/commit-gate-runner.mjs:163-238
Question: Does the Commit Gate keep the full-owner expansion on config change?
Accepted answer:
- Yes. The rule stays; the file list is passed through stdin, not argv.
Q29
Prerequisites:
- Q3
Question: Is the harness set fixed?
Accepted answer:
- Yes: Claude, Codex, Cursor, OpenCode, always all four. A selectable set per repository is parked.
Q30
Prerequisites:
- Q1
Question: Which commands remain?
Accepted answer:
hi initfor first install,hi update,hi diff,hi check.hi scaffoldis retired intoinit. There is nohi add; the user rejected it as a command that never existed.
Q31
Prerequisites:
- Q1
Evidence anchor:
apps/cli/src/scaffold/skill-snapshot.ts:19-50(snapshotPreExistingSkillHomes);.devpunks/pre-existing-skills(6.7 MB, 496 files in this repository)
Observed constraint:
- The archive existed only to keep skills that were present before scaffold and that scaffold then removed from the harness directories.
Question:
What happens to the replaced-scaffold, replaced-skills, and
pre-existing-skills archives?
Accepted answer:
replaced-scaffoldandreplaced-skillsare retired; a conflict shows as a git diff.- Scaffold does not remove pre-existing skills. It copies them into
.agents/skills/<id>and they are reachable through the existing harness symlinks. They are Authored Artifacts. Thepre-existing-skillsarchive is no longer needed.
Code consequence:
- The skill snapshot step becomes a move-into-place step. Project Skills are never compared or overwritten.
Q32
Prerequisites:
- Q1
Question: Which canonical terms are added and which are retired?
Accepted answer:
- Added: Registry, Registry Item, Baseline (one Registry version), Installed Record, Recorded Shape, Copied Artifact, Built Artifact, Authored Artifact.
- Kept: Pack, Software Scope, Harness Adapter, Drift Check (new meaning).
- Retired: Scaffold Manifest, Validation Candidate, Prepared Installation, Validation Result, Cache Entry, Context Plan as a persisted file.
Glossary Q32a
Question: What is a skill that the repository had before Harness and that no Registry Item provides?
Accepted answer:
- Canonical term: Project Skill — a skill under
.agents/skills/<id>that no Registry Item provides; it is an Authored Artifact. - Avoid: pre-existing skill, local skill, replaced skill
- Relationship: a Project Skill is an Authored Artifact.
- Axiom: the installer never removes, compares, or overwrites a Project Skill.
Round 2 (2026-09-27)
Q33
Prerequisites:
- Q20, Q31
Evidence anchor:
.devpunks/scaffold-manifest.json,harness-projection-receipt.json,context-plan.json,specs/lint/assets.json,replaced-scaffold/,replaced-skills/,pre-existing-skills/(current consumer state)apps/cli/src/features/project-settings/service.ts:464-530(settings fields)
Observed constraint:
- Every consumer repository carries manifest-era state that the new installer neither reads nor writes.
Question: How does an existing manifest-based repository migrate?
Accepted answer:
- The first registry-based
hi updatemigrates in the same run. It reads the oldsettings.jsonfor Packs, Software Scopes, providers, and required tools; runs detection once to build the Recorded Shape; writesinstalled.json; moves skills from thepre-existing-skillsarchive into.agents/skillsas Project Skills; deletes the manifest, receipt, context plan,specs/lint/assets.json,replaced-scaffold,replaced-skills, and the emptied archive; keeps every Authored Artifact; then continues as a normal update and reports each deletion. No separate migrate command.
Code consequence:
- Migration is a branch inside
hi update, keyed on the presence of the old manifest and the absence ofinstalled.json.
Q34
Prerequisites:
- Q31
Evidence anchor:
.claude/skills -> ../.agents/skills(symlink; every harness lists the same directory)
Question: What happens when a Registry Item later provides a skill with a Project Skill's id?
Accepted answer:
- The Baseline skill wins. The installer renames the Project Skill to
[DEPRECATED] <name>and installs the Registry Item under the original id. The command reports every such case to the user. - Consequence noted: the renamed directory stays visible in every harness's skill list under the deprecated name, through the shared symlink.
Code consequence:
- The Project Skill axiom becomes: never removed or overwritten; renamed only on id collision with a Registry Item, and reported.
Q35
Prerequisites:
- Q22, Q30
Question: Can settings select individual Registry Items outside Packs?
Accepted answer:
- No. Packs are the only selection unit. Single-item selection is parked with the resume trigger: a real request for one skill that no Pack contains.