Closes the last promote gap: a manifest can now reference records it does not create.
A value like #thirdparty:name=KissMetrics (or :code=CL0007) is looked up on the target at apply time and resolved to that target's id — so the same manifest is portable (sandbox id on --target sandbox, prod id on --target prod). Combined with @ref (created entities), arbitrary change-sets replay cleanly.
promote-apply.shresolve() gains a # branch + a lookup() helper querying the target via the GET wrapper with sqlfilters. Supports thirdparty (name/code/supplier_code) and invoice/supplierinvoice (ref/ref_supplier).
Safety: a lookup matching nothing or more than one record aborts the run — it never guesses, so it can't write to the wrong entity.
Proven live
#thirdparty:name=ACME Conseil → resolved to the existing client → invoiced it (id 25) + paid
#thirdparty:code=NOPE9999 → 404, run aborted (exit 1)
#thirdparty:name=ZZZ-DUP (2x) → "ambiguous (2 matches)", run aborted (exit 1)
So "invoice the existing client KissMetrics and record its payment" is now expressible and portable across sandbox→prod. That completes the promote flow.
Closes the last promote gap: a manifest can now reference records it does **not** create.
A value like **`#thirdparty:name=KissMetrics`** (or `:code=CL0007`) is looked up on the **target** at apply time and resolved to *that target's* id — so the same manifest is portable (sandbox id on `--target sandbox`, prod id on `--target prod`). Combined with `@ref` (created entities), arbitrary change-sets replay cleanly.
- `promote-apply.sh` `resolve()` gains a `#` branch + a `lookup()` helper querying the target via the GET wrapper with `sqlfilters`. Supports `thirdparty` (name/code/supplier_code) and `invoice`/`supplierinvoice` (ref/ref_supplier).
- **Safety:** a lookup matching **nothing or more than one** record **aborts the run** — it never guesses, so it can't write to the wrong entity.
### Proven live
```
#thirdparty:name=ACME Conseil → resolved to the existing client → invoiced it (id 25) + paid
#thirdparty:code=NOPE9999 → 404, run aborted (exit 1)
#thirdparty:name=ZZZ-DUP (2x) → "ambiguous (2 matches)", run aborted (exit 1)
```
So *"invoice the existing client KissMetrics and record its payment"* is now expressible and portable across sandbox→prod. That completes the promote flow.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Closes the last promote gap: a manifest can now reference records it does NOT
create. A value like "#thirdparty:name=KissMetrics" (or :code=CL0007) is looked
up on the TARGET at apply time and resolved to that target's id — so the same
manifest is portable (sandbox id on --target sandbox, prod id on --target prod).
promote-apply.sh: resolve() gains a "#" branch + a lookup() helper that queries
the target via the GET wrapper with sqlfilters. Supports thirdparty
(name/code/supplier_code) and invoice/supplierinvoice (ref/ref_supplier). A
lookup matching nothing OR more than one record ABORTS the run — it never
guesses, so it cannot write to the wrong entity.
Proven live: "#thirdparty:name=ACME Conseil" resolved to the existing client and
invoiced it; a not-found code and an ambiguous (2-match) name both aborted with
exit 1. Combined with @refs, arbitrary self-contained-or-referential change-sets
now replay cleanly.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes the last promote gap: a manifest can now reference records it does not create.
A value like
#thirdparty:name=KissMetrics(or:code=CL0007) is looked up on the target at apply time and resolved to that target's id — so the same manifest is portable (sandbox id on--target sandbox, prod id on--target prod). Combined with@ref(created entities), arbitrary change-sets replay cleanly.promote-apply.shresolve()gains a#branch + alookup()helper querying the target via the GET wrapper withsqlfilters. Supportsthirdparty(name/code/supplier_code) andinvoice/supplierinvoice(ref/ref_supplier).Proven live
So "invoice the existing client KissMetrics and record its payment" is now expressible and portable across sandbox→prod. That completes the promote flow.
🤖 Generated with Claude Code