Commit 0f152bf
docs(agent-context): the names artifact hands you a string; placing it is per-driver
Found by converting a live adopter estate off ~200 literal physical names. The
artifact half was uneventful. The half that cost the afternoon was getting a name
into identifier position, and the page said nothing about it — one `sql.identifier`
example, on one driver, and no statement that the question even varies.
Three additions, ordered so a reader on a driver this page has never heard of still
gets the rule:
**`excluded.<column>` has no typed handle.** In an `ON CONFLICT … DO UPDATE SET` the
`set` keys are field names the ORM maps, but the value on the right is raw SQL, and
`excluded` is a pseudo-table bound to the row the INSERT proposed — no column object
exists for it. That is the one place a physical name is unavoidable in otherwise
fully-typed code, so it is where the constant earns the most. The estate had 23 of
them. The EXISTING row is reachable, and the page now says so: Postgres exposes it
under the table's own name inside ON CONFLICT, and a Drizzle column object renders
as exactly that qualified name.
**The per-driver section leads with the rule, not with a driver.** Find your driver's
identifier form once, wrap it in a one-line helper, use the helper everywhere — and
two properties decide whether a form is the right one: it escapes (the physical name
is free-form, so concatenation is wrong), and it means the same thing in EVERY clause.
The second is the one that bites, so the page says to test a helper across SELECT /
FROM / WHERE / INSERT INTO / a column list / UPDATE SET / a transaction against a real
engine before committing to it.
**postgres.js is the worked example of that second property failing**, kept because
the failure is silent until it is a syntax error: `sql(name)` is not an identifier —
it dispatches on the SQL text BEFORE the interpolation, so `INSERT INTO ${sql(t)} (…)`
hits the library's insert-builder, reads the value as a row object, and dies with
`syntax error at or near "("`. `sql([name])` survives that one and is the same
trapdoor a clause away. The inert form is a quoted identifier through `unsafe`,
verified against a live engine in all seven positions above.
Plus the derive-the-helpers-from-the-artifact shape, so a module that touches one
table names the ENTITY rather than restating its own field list — a hand-written list
of four columns is smaller than a spelled-out name but the same kind of thing, and it
goes stale the same way when the entity gains a column.
Deliberately NOT written as "here is the Drizzle recipe and here is the postgres.js
recipe": that is how a page teaches an adopter on Kysely or `pg` or mysql2 that the
guidance does not cover them. The named drivers are examples of a class.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01At3v6M6uqECZ2Sb5eUv6YY1 parent eb96780 commit 0f152bf
3 files changed
Lines changed: 210 additions & 0 deletions
File tree
- agent-context/skills/metaobjects-runtime-ui/references
- fixtures/agent-context-conformance
- ts-react-tanstack/expected/.claude/skills/metaobjects-runtime-ui/references
- ts-requirements/expected/.claude/skills/metaobjects-runtime-ui/references
Lines changed: 70 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
90 | 160 | | |
91 | 161 | | |
92 | 162 | | |
| |||
Lines changed: 70 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
90 | 160 | | |
91 | 161 | | |
92 | 162 | | |
| |||
Lines changed: 70 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
90 | 160 | | |
91 | 161 | | |
92 | 162 | | |
| |||
0 commit comments