@bongos/core 1.19.467 → 1.19.468
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.468",
|
|
6
|
+
"core_contract": "1.19.468",
|
|
7
|
+
"source_commit": "46a154331618a8c57ed0d178e7bfe13e180b7559",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-02T14:11:23.358Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 408,
|
|
13
13
|
"agent_docs_stubbed": 24,
|
|
14
14
|
"functional_verbatim": 1823,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2255,
|
|
20
|
+
"tree_sha256": "96abcd9bb3bfd8f8bfc4930c27fe91aa04b9f59717743a5b059f768854c865c3",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1629,10 +1629,15 @@
|
|
|
1629
1629
|
"mode": "0000644",
|
|
1630
1630
|
"sha256": "717bdc174891ccf5bc8756b25f53eca016d4d6dfaeebec8d12bb2a6bfef56976"
|
|
1631
1631
|
},
|
|
1632
|
+
{
|
|
1633
|
+
"path": "docs/adr/0225-privacy-suppresses-cross-project-surfaces-only.md",
|
|
1634
|
+
"mode": "0000644",
|
|
1635
|
+
"sha256": "f9f3a0b8ebe2d161e17e1c632bbbda71842c9476958294330420f28c6301f7db"
|
|
1636
|
+
},
|
|
1632
1637
|
{
|
|
1633
1638
|
"path": "docs/adr/README.md",
|
|
1634
1639
|
"mode": "0000644",
|
|
1635
|
-
"sha256": "
|
|
1640
|
+
"sha256": "7b353237a164c704ac247646b93c419b26cc5fd8e53ac81e63b553146df76c85"
|
|
1636
1641
|
},
|
|
1637
1642
|
{
|
|
1638
1643
|
"path": "docs/api-reference.md",
|
|
@@ -2122,7 +2127,7 @@
|
|
|
2122
2127
|
{
|
|
2123
2128
|
"path": "docs/module-api-changelog.md",
|
|
2124
2129
|
"mode": "0000644",
|
|
2125
|
-
"sha256": "
|
|
2130
|
+
"sha256": "b0ee40d833a5f28cba9450cc355d4b2b922def1e95fed5725ebee8796f2918a6"
|
|
2126
2131
|
},
|
|
2127
2132
|
{
|
|
2128
2133
|
"path": "docs/modules-contract.md",
|
|
@@ -6622,12 +6627,12 @@
|
|
|
6622
6627
|
{
|
|
6623
6628
|
"path": "package-lock.json",
|
|
6624
6629
|
"mode": "0000644",
|
|
6625
|
-
"sha256": "
|
|
6630
|
+
"sha256": "775fa829d773f6c39be8c93c544e77c005304ff78a3c879778292fd5dc806ee8"
|
|
6626
6631
|
},
|
|
6627
6632
|
{
|
|
6628
6633
|
"path": "package.json",
|
|
6629
6634
|
"mode": "0000644",
|
|
6630
|
-
"sha256": "
|
|
6635
|
+
"sha256": "0d5b71ad68cce7afe9f0d4b35f8f4105fad5f00f46e91f60659ebf064f288f62"
|
|
6631
6636
|
},
|
|
6632
6637
|
{
|
|
6633
6638
|
"path": "public-docs/index.html",
|
|
@@ -8277,7 +8282,7 @@
|
|
|
8277
8282
|
{
|
|
8278
8283
|
"path": "src/module-api.js",
|
|
8279
8284
|
"mode": "0000644",
|
|
8280
|
-
"sha256": "
|
|
8285
|
+
"sha256": "97199ab275115c07426ca83be7b0c618b3aebdb4b1e9349ab90ea989f8d625b4"
|
|
8281
8286
|
},
|
|
8282
8287
|
{
|
|
8283
8288
|
"path": "src/module-loader/catalog.js",
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 0225 — Privacy suppresses cross-project surfaces only: a private builder still appears on their own project's roster
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-09-02
|
|
5
|
+
- **Tasks:** [#1003443](https://cloudbongos.com/builders#/task/1003443) (goal 1000075 — collaboration and the social hall; criterion `community-is-one-builders-page`)
|
|
6
|
+
- **Related:** [ADR 0171](<redacted>.md) (owns `hide_stats` + `profile_state`, fail-closed consent in the READ path) · [`docs/specs/<redacted>.md`](../specs/<redacted>.md) (the spec this amends)
|
|
7
|
+
|
|
8
|
+
## 1. Why this ADR exists
|
|
9
|
+
|
|
10
|
+
The privacy spec is **accepted**, and for one case it defined its two flags
|
|
11
|
+
inconsistently. Found 2026-08-30 while scoping the Builders page:
|
|
12
|
+
|
|
13
|
+
- `hide_stats` suppresses *"everything derived from the **cross-project rollup**"* —
|
|
14
|
+
qualified, so a project's own in-hall leaderboard is plainly out of scope.
|
|
15
|
+
- `account_visibility: private` said *"absent from search, **leaderboards**, sitemap"* —
|
|
16
|
+
**not** qualified, so it read as covering the in-project leaderboard too.
|
|
17
|
+
|
|
18
|
+
Two readers could act on the same accepted spec and build opposite behaviour. Worse,
|
|
19
|
+
PV2 requires *"ONE shared predicate used by every public read: … leaderboards …"*,
|
|
20
|
+
while `modules/economy/credits.js`'s `leaderboard()` is a bare
|
|
21
|
+
`SELECT … FROM builders ORDER BY total_credits DESC` — no join to
|
|
22
|
+
`platform_identity_accounts`, no predicate at all. Read one way that is an unshipped
|
|
23
|
+
PV2 violation sitting in main; read the other way it is correct. Nothing in the
|
|
24
|
+
documents settled which.
|
|
25
|
+
|
|
26
|
+
## 2. The decision
|
|
27
|
+
|
|
28
|
+
**Privacy suppresses CROSS-PROJECT surfaces only.** Owner, 2026-08-30.
|
|
29
|
+
|
|
30
|
+
A builder marked `private` is absent from `/u/<handle>`, platform search, the sitemap,
|
|
31
|
+
Explore-adjacent surfaces and the recruiting reach — every surface that is *about the
|
|
32
|
+
platform*. They still appear on the roster and leaderboard of a project they actually
|
|
33
|
+
build on, because **a project's record of its own work is the project's business**. The
|
|
34
|
+
flag governs how far a builder's identity travels, not whether the work they did for
|
|
35
|
+
you is yours to show.
|
|
36
|
+
|
|
37
|
+
Two things follow, and they are the point of writing this down:
|
|
38
|
+
|
|
39
|
+
- **`credits.leaderboard()` is correct as written and needs no change.** Adding a
|
|
40
|
+
visibility predicate there would be a regression, not a fix — which is exactly what
|
|
41
|
+
a future session reading PV2 literally would have done.
|
|
42
|
+
- **PV2's "every public read … leaderboards" means the cross-project leaderboards.**
|
|
43
|
+
The shared predicate still owns every surface it names; the in-project ledger was
|
|
44
|
+
never one of them.
|
|
45
|
+
|
|
46
|
+
## 3. What changed
|
|
47
|
+
|
|
48
|
+
The spec was amended rather than left to be re-litigated — the ambiguity was in its
|
|
49
|
+
wording, so the wording is the fix (task 1003443):
|
|
50
|
+
|
|
51
|
+
- the D1 `account_visibility` row now says *cross-project* leaderboards, and says
|
|
52
|
+
outright that the flag does not reach a project's own roster;
|
|
53
|
+
- the two `active · private` matrix rows no longer say **"absent everywhere"** — the
|
|
54
|
+
single most misreadable phrase in the file — but "absent from every cross-project
|
|
55
|
+
surface";
|
|
56
|
+
- the `active · public` rows qualify their "leaderboards" the same way, so the matrix
|
|
57
|
+
cannot be read against the table;
|
|
58
|
+
- PV2's own ship-table row is qualified too;
|
|
59
|
+
- and the boundary is stated as the **third rule** under D2, beside "`hide_stats`
|
|
60
|
+
beats everything", because that block is where a reader looks for the rules the
|
|
61
|
+
matrix encodes.
|
|
62
|
+
|
|
63
|
+
## 4. Rejected
|
|
64
|
+
|
|
65
|
+
**Making `private` hide a builder from the projects they build on.** It reads as the
|
|
66
|
+
more privacy-protective option and is the reason the ambiguity was worth an owner
|
|
67
|
+
decision rather than a coin flip. Rejected because it breaks the ledger: a project
|
|
68
|
+
whose roster silently omits contributors cannot show who built it, credits and karma
|
|
69
|
+
would be awarded to someone invisible on the surface that explains them, and the
|
|
70
|
+
in-hall leaderboard would disagree with the task history any builder can already read.
|
|
71
|
+
Privacy about *the platform* does not imply anonymity *inside a project you joined*.
|
|
72
|
+
|
|
73
|
+
**Leaving it as a dated note in the spec.** The task offered this and it is the wrong
|
|
74
|
+
shape: the decision resolves a stated ambiguity in an accepted spec and pins a piece
|
|
75
|
+
of shipped code as deliberately predicate-free. That is an ADR's job — a note in a
|
|
76
|
+
spec is not what a future session greps when it wonders why one leaderboard query has
|
|
77
|
+
no visibility join.
|
|
78
|
+
|
|
79
|
+
## 5. What this does not decide
|
|
80
|
+
|
|
81
|
+
Whether an in-project roster may be made public to the world (a per-project
|
|
82
|
+
visibility question the platform owns — goal 1000058's `platformVisibility`), and
|
|
83
|
+
whether a builder can leave a project's roster entirely. Both are about the
|
|
84
|
+
*project's* surface, not the account flag this ADR scopes.
|
package/docs/adr/README.md
CHANGED
|
@@ -311,5 +311,6 @@ This keeps the decision history honest and traceable.
|
|
|
311
311
|
| 0222 | [**The image family under the hero-only rule: plates and hero objects, never screens; the mark is drawn; the board is a contact sheet; the pair and the sidecar are the output contract** ([task 1003328](https://cloudbongos.com/builders#/task/1003328) · goal 1000083). The four image skills of `Leonxlnx/taste-skill` (scanned `dangerous`, ADR 0198) are built around pictures of interfaces: one reference image per section, one app screen per flow step in a phone mockup, an identity board with the brand name rendered in, and a build loop whose truth is the generated image; the panel flagged the eagerness mandate, the image-count rule and the must-invoke-any-tool directive by name, and the owner's rule (2026-08-26/27) forbids the category. Decisions: **D1** the subject is the composition's plate slots and the count is the slot count; variety survives as anchors (field, beside-bleeding, masthead, orb, backdrop; text-left image-right refused), the palette lock is the pack, cross-frame consistency is one family (material, light, lens, ground). **D2** a screen is the surface itself: the mobile skill makes portrait plates for 390 / 320, the flow is the states file rendered by the kit, the bible is `DESIGN.md`, no phone mockup, native declines to `/design`. **D3** the source of truth for UI is the owner's references and the world; `image-to-code` reads them (analysis, extraction spec, faithful translation, drift as the failure mode, the clarity checklist) and the only image it may cause is the hero plate. **D4** the mark is drawn as inline SVG, the colour system is the pack, the type specimen is the faces on a real page, the applications are the kit's renders, the image direction is a hero-object family, the nine-panel board is a contact sheet of real parts. **D5** the output contract is DESIGN.md's pair and sidecar (JPEG dark plate, WebP alpha cutout, `<file>.<ext>.json` beside each, `--plate-*` tokens on `body`) through the instance's art pipeline key, the spend logged, a white ground through the remover, alpha verified with ffmpeg, never a crop. **D6** the worked example is the grove specimen's hero object, not the front door. **D7** the pins: the four declared, each naming the sidecar, "text-free" and the art key; no eagerness / count / per-section / must-invoke directive. Rejected: per-section images for reference only; phone mockups around real shots; a generated logo as a start; the plate on the front door; a shared base skill with wrappers.](<redacted>.md) | ui-design / skills / imagery |
|
|
312
312
|
| 0223 | [**The anti-pattern detector is two tiers inside the kit: mechanical floors fail, craft tells warn, a false positive is waived in the file with its reason, and nothing new is installed** ([task 1003329](https://cloudbongos.com/builders#/task/1003329) · goal 1000083). The [detector] group of impeccable's rebuild spec (about sixty rules, a CLI plus a browser bundle wired to hooks, per-project ignores, in-file waivers, "a clean scan is a floor and never proof") lands as RULES in the kit that already exists, per the task body: no second tool, no bundle, no hook. Decisions: **D1** `kit/tells.js` carries the static rules and `check-mock.js` runs them after the platform rules and taste bans; `lib.js`'s `factsInPage` collects the computed-value twins as `tells` and `render.js` prints them as `~ tell:` lines per render, recorded in `report.json`, never counted as problems. Two tiers: floors FAIL (a bounce easing; a card nested in a card) and tells WARN (the icon-heading-text grid, hero metrics, section numbering, a kicker above the h1, a side stripe, a hard offset shadow, a coloured halo, decorative blur, a default typeface, a wide measure, a long headline, the same entrance everywhere, a geometric mask on a plate, glyphs as icons, a rainbow gradient, the browser surfaces nobody themed, proportional numerals, tiny type; rendered: measure, tiny text, numerals in cells, headline lines, an overshooting curve). **D2** the world decides which tells are floors: a kicker above the h1 is a FAIL where the instance's `DESIGN.md` bans the eyebrow (a new `eyebrow` taste key), a WARN elsewhere. **D3** a false positive is waived in the file with its reason (`kit-ignore: <rule prefix> (reason)` → a WAIVE row), `--raw` runs with none, `--no-tells` runs the platform rules only, `--json` prints rows with `fails` / `warns` counts; no per-project ignore config. **D4** not ported: the purple-to-blue tell (a literal colour already fails; hue is unresolvable under the fifteen), an injected overlay, the screenshot sampler (`contrast.js --url` is that pass), a cascade resolver (the browser is the resolver), native code, every hook. **D5** the pins: a clean fixture passes every rule, every rule class trips at its tier with the case count equal to the rule count, the promotion, the waiver / raw / json paths through the real CLI, `craftTells` as warnings; the hub mock and the three specimens still pass, `/projects` and the grove specimen still render ALL CLEAN. Rejected: a second CLI; every tell as a floor (the kit as the taste and the instance as the exception); a project-wide ignore config; an edit-time hook.](0223-the-detector-is-two-tiers-in-the-kit.md) | ui-design / kit |
|
|
313
313
|
| 0224 | [**Module-owned skills reach the core checkout as untracked, self-ignored copies with a manifest: the self-copy guard stays, the dev path is a flag, and the file map skips what the module documents** ([task 1003330](https://cloudbongos.com/builders#/task/1003330) · goal 1000083). `materializeClaude`'s self-copy guard is right (a core copying itself is a no-op at best), but Claude Code discovers only `.claude/skills/` at the project root, so a builder IN the core checkout could not invoke any of the nine ui-design skills written there. Decisions: **D1** `node scripts/gds/claude-materialize.js --module-skills-only [--dry-run] [--clean]` calls `materializeModuleSkillsIntoCore`: the same roster, gate and slug rule as step 1b, verbatim copies (no bongosify: the checkout runs `node scripts/gds/…`), a core-owned name kept, a disabled module's excluded; the guard untouched. **D2** untracked and self-ignored: a generated `.claude/skills/.module-skills.json` manifest and a `.gitignore` that ignores itself, the manifest and every materialised dir; each run removes what the last manifest named then lands the current set (byte-identical on repeat; a dropped declaration disappears); `--clean` stops after the removal. **D3** `gen-file-map.js` and `tests/file_map.mjs` skip materialised names by the manifest (a module skill is documented by its module's README, not by the notes sidecar). **D4** init from a checkout that carries the copies still lands them through step 1b, transformed, and never the dotfiles. **D5** pinned end to end in `tests/claude_materialize.mjs`. Rejected: dropping the guard; committing the copies; symlinks or junctions; notes for dirs not in the repository.](<redacted>.md) | materialiser / skills |
|
|
314
|
+
| 0225 | [**Privacy suppresses cross-project surfaces only: a private builder still appears on their own project's roster** ([task 1003443](https://cloudbongos.com/builders#/task/1003443) · goal 1000075). The accepted privacy spec defined its two flags inconsistently for one case: `hide_stats` suppresses "everything derived from the CROSS-PROJECT rollup" (qualified, so an in-project leaderboard is out of scope) while `account_visibility: private` said "absent from search, LEADERBOARDS, sitemap" (unqualified, so it read as covering the in-project one too) — and PV2 demands "ONE shared predicate used by every public read: … leaderboards …" while `modules/economy/credits.js`'s `leaderboard()` is a bare `SELECT … FROM builders` with no join and no predicate. Read one way that is an unshipped PV2 violation in main; read the other it is correct, and nothing settled which. **Owner decision (2026-08-30): privacy suppresses CROSS-PROJECT surfaces only.** A `private` builder is absent from `/u/<handle>`, platform search, the sitemap, Explore and the recruiting reach, and still appears on the roster of a project they build on — a project's record of its own work is the project's business. Two consequences are the point of recording it: `credits.leaderboard()` is **correct as written** (adding a predicate there would be a regression, not a fix — exactly what a literal PV2 reading would have done), and PV2's "leaderboards" means the cross-project ones. The spec was amended rather than annotated: the D1 row and both `active · public` matrix rows now say *cross-project*, the two `active · private` rows drop "absent everywhere" (the file's most misreadable phrase) for "absent from every cross-project surface", PV2's ship-table row is qualified, and the boundary lands as the **third rule** under D2 beside "`hide_stats` beats everything". Rejected: making `private` hide a builder from projects they build on (it reads as more protective and breaks the ledger — a roster that omits contributors cannot show who built the thing, and credits would accrue to someone invisible on the surface explaining them); and leaving it as a dated spec note (it pins shipped code as deliberately predicate-free, which is an ADR's job).](<redacted>.md) | privacy / spec |
|
|
314
315
|
|
|
315
316
|
> ⚠️ **Numbering collisions are now machine-enforced, not narrated.** Twenty numbers are shared by two ADRs each — assigned in parallel sessions before anything checked. The files keep their filenames (renumbering would break every existing citation, and a number once assigned is never reused), and this table disambiguates each pair as `NNNN-a` / `NNNN-b`. The authoritative list is `LEGACY_DUPLICATE_ADRS` in [`scripts/gds/adr-namespace.js`](../../scripts/gds/adr-namespace.js), frozen by exact filename: a **new** collision — or a third file joining a legacy number, or a rename of either half — hard-fails the `unit` CI gate, as does an index row that points at no file or an ADR with no row. The list may only shrink. This paragraph used to narrate the collisions one by one and had fallen eight behind reality; see [ADR 0195](<redacted>.md) for why the check exists and why the pairs are grandfathered rather than renumbered.
|
|
@@ -1371,5 +1371,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1371
1371
|
landed since 1.19.465 with no explicit bump. run 33583122775. (task 1002620)
|
|
1372
1372
|
1.19.467 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1373
1373
|
landed since 1.19.466 with no explicit bump. run 33638703282. (task 1002620)
|
|
1374
|
+
1.19.468 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1375
|
+
landed since 1.19.467 with no explicit bump. run 33640370009. (task 1002620)
|
|
1374
1376
|
---------------------------------------------------------------------------
|
|
1375
1377
|
```
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.468",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.468",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.468",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/src/module-api.js
CHANGED
|
@@ -33,7 +33,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
33
33
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
34
34
|
// the entry to that file. Look for a version's history there, not here.
|
|
35
35
|
// ---------------------------------------------------------------------------
|
|
36
|
-
const CORE_VERSION = '1.19.
|
|
36
|
+
const CORE_VERSION = '1.19.468'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
37
37
|
|
|
38
38
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
39
39
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|