Skip to content

Commit 14386ac

Browse files
dmealingclaude
andcommitted
docs(changelog): the second FR-040 review round
Records the seven findings and the one that turned out sharper than filed: with the client directive dropped from a reference template ALONE, the byte-identical equivalence gate stays green — it generates with the knob off, where the call is a no-op, so it compares no byte the change touched. That gate cannot see the defect in either direction, not just the both-halves-edited direction the finding described. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162AvR8vGak1snx5a7cu47T
1 parent 0cbb7dd commit 14386ac

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,51 @@ quiet failure mode is a config that keeps running the PACKAGED generator while y
183183
the ejected file — and never named the dependency the ejected file imports, so the
184184
adopter's own `tsc` reported TS2307 on the file the CLI had just said they owned.
185185

186+
**Second review round.** Seven more findings, and the two worth naming share a shape with
187+
the first round's: a change that was RIGHT drew its line one notch too wide, and nothing
188+
could see the difference. **The retargeting split took four ports' `own*()` guidance with
189+
it.** Moving `meta eject` and the `metaobjects.config.ts` keys out of the port-agnostic
190+
`SKILL.md` was correct — a Python project runs `metaobjects gen` and has no eject command,
191+
so those adopters' agents were being handed a procedure their toolchain cannot execute.
192+
But the same move carried off the ADR-0039 section, whose per-port own↔resolving **table
193+
is port-agnostic by construction**: its entire content is the OTHER ports' accessor names,
194+
including the trap that TS `attr()` resolves while Python `attr()` is own. It landed in
195+
`references/typescript.md`, the one page a Java, Python or C# adopter never installs,
196+
while `metaobjects-authoring` still told them to go read it there. And `SKILL.md` closed
197+
by sending every reader to "this skill's `references/` fragment for your server language",
198+
which for four of the five contains no retargeting content at all — a pointer to nothing,
199+
where before the split there had at least been a procedure (a wrong one, which is what the
200+
split fixed). The three port-agnostic sections are back in `SKILL.md`, and the closing
201+
pointer now says what is true per port, including that the other ports have **no** eject
202+
command and owning a generator there means implementing that port's generator interface.
203+
204+
**`meta init` claimed a stub it had just decided not to write.** Its next-steps block was
205+
one static string describing the scaffolded `src/db.ts` in the imperative, printed on every
206+
run — including the `meta init --force` in a project keeping its own config, where the
207+
write is deliberately skipped. Worse was the silence beside it: `wroteScaffoldedConfig` is
208+
only *"no config existed"*, so it is false for the config `init` itself wrote one command
209+
earlier, and a scaffolded project whose `src/db.ts` is deleted lands in the same branch as
210+
a project that owns its config — nothing written, nothing preserved, **nothing said**, and
211+
the next `tsc` reporting `TS2307` on a file the command had just chosen not to restore. It
212+
warns now rather than writing, because dropping a file into a project that owns its config
213+
is the unilateral host-project touch FR-040 §4.4 lists as a defect.
214+
215+
Also from the round: `meta eject` **stated which import a project currently has**, which
216+
it never checks and which is wrong for exactly the four `meta init` scaffolds — the
217+
`--force` re-sync case — so it names the goal and the three branches instead; its
218+
dependency notes could not see a subpath import and reported a **peer-declared package as
219+
missing**, advice that if followed adds the competing physical copy this repo has been
220+
bitten by twice; and **nothing gated `clientDirective` on the generated form**, the one
221+
client artifact the RSC story centres on. That last one is the round's own theme again,
222+
and the proof is sharper than the finding: with the directive dropped from a reference
223+
template alone — the two halves genuinely different — `reference-byte-identical` stays
224+
**green**, because it generates with the knob off, where the call is a no-op and removing
225+
it changes no byte it compares. The equivalence gate cannot see that defect in either
226+
direction. Both UI packages now run the knob against the built-in and the reference
227+
template, and each package's template coverage is a `Record` keyed by ejectable name whose
228+
keys are the proof and whose values are the wiring — so a tenth template is a **compile**
229+
error, not a hand-maintained list that can be edited to claim a gate nobody wrote.
230+
186231
### Fixed — eight defects found by adopting the product from scratch, twice
187232

188233
Two adoption runs against the published `0.24.4`, docs followed literally and nothing fixed

0 commit comments

Comments
 (0)