Deferred from the keyword-hygiene batch (#548, §3.3). The review recommended renaming the binding-level requires { … } (the adapter npm-dependency map, ADR 0013) to disambiguate it from the function-precondition requires. That rename was not done in the batch, for two reasons:
- It collides with the packaging track.
design/tracks/packaging.md §2 (Non-goals) explicitly keeps binding requires as-is and reuses packages / [package] vocabulary at the manifest level — so renaming binding requires→packages now would pre-empt the track's chosen terms.
- The real question is deeper than a rename. Should the npm dependency + pinned range even live in
.bynk source, or move to the .ts binding's own package.json manifest?
The question
Today (ADR 0013):
adapter tokens {
binding "./tokens.binding.ts" requires { "jose": "^5" }
…
}
The pinned range lives in .bynk because (a) a TS import "jose" carries no version range, and (b) the Bynk compiler owns package.json generation and the supply-chain trust surface (still-Open ADR 0020).
The alternative — give each binding its own real package.json and have the compiler read that instead of a requires clause — is a redesign of the binding-as-package model, which is squarely the packaging track's remit (it owns the dependency surface and closes ADR 0020).
Disposition
To be resolved by the packaging track when it reaches the dependency surface. Forks to weigh:
- A — keep
requires { } in .bynk (status quo, ADR 0013). Possibly rename the keyword to avoid the function-requires pun if the track's packages/[package] vocabulary leaves room.
- B — move deps to the
.ts binding's own manifest and have the compiler read it. Closes the pun by removing the surface; changes the binding model.
Provenance: #548 (Bynk Language Design Review 2026-07-05, §8 Language P1 #9). Relates: ADR 0013, ADR 0020, design/tracks/packaging.md.
Deferred from the keyword-hygiene batch (#548, §3.3). The review recommended renaming the binding-level
requires { … }(the adapter npm-dependency map, ADR 0013) to disambiguate it from the function-preconditionrequires. That rename was not done in the batch, for two reasons:design/tracks/packaging.md§2 (Non-goals) explicitly keeps bindingrequiresas-is and reusespackages/[package]vocabulary at the manifest level — so renaming bindingrequires→packagesnow would pre-empt the track's chosen terms..bynksource, or move to the.tsbinding's ownpackage.jsonmanifest?The question
Today (ADR 0013):
The pinned range lives in
.bynkbecause (a) a TSimport "jose"carries no version range, and (b) the Bynk compiler ownspackage.jsongeneration and the supply-chain trust surface (still-Open ADR 0020).The alternative — give each binding its own real
package.jsonand have the compiler read that instead of arequiresclause — is a redesign of the binding-as-package model, which is squarely the packaging track's remit (it owns the dependency surface and closes ADR 0020).Disposition
To be resolved by the packaging track when it reaches the dependency surface. Forks to weigh:
requires { }in.bynk(status quo, ADR 0013). Possibly rename the keyword to avoid the function-requirespun if the track'spackages/[package]vocabulary leaves room..tsbinding's own manifest and have the compiler read it. Closes the pun by removing the surface; changes the binding model.Provenance: #548 (Bynk Language Design Review 2026-07-05, §8 Language P1 #9). Relates: ADR 0013, ADR 0020,
design/tracks/packaging.md.