Repository navigation
Add China Merchants Bank reference architecture - #1976
mrbobbytables wants to merge 6 commits into
Conversation
Adds the reference architecture submitted to the End User TAB in cncf/tab#140: unified training and inference on Kubernetes across a heterogeneous accelerator pool, using Kubernetes, KEDA, Prometheus, HAMi and Fluid with Kueue admission control. - Hand-authored docs/architectures/china-merchants-bank/index.md with the architecture diagram colocated under images/ - Mirrored HAMi and Fluid icons from cncf/artwork - Regenerated data/architectures/catalog.json - Accept cncf/tab submission issues as a sourceIssue origin in the catalog contract test and CONTRIBUTING.md - Added project and vendor terms to the spelling dictionary Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: mrbobbytables <mrbobbytables@users.noreply.github.com>
✅ Deploy Preview for endusers ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
A reference architecture page may be authored directly from a source that is neither a cncf/architecture import nor a submission issue in this repository. validate:architectures now requires at most one of sourceCommit or sourceIssue instead of exactly one; the catalog contract test, e2e attribution check, CONTRIBUTING.md and ADR 0010 follow. The China Merchants Bank page keeps cncf/tab#140 as its sourceUrl and drops sourceIssue. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: mrbobbytables <mrbobbytables@users.noreply.github.com>
There was a problem hiding this comment.
Read the diff against the tree at head 6187aec and ran the downstream pipelines. One verified gap, otherwise this looks correct.
The members pipeline was not updated for the new "neither source" provenance shape, and this PR lands the first record that trips it.
scripts/generate-members.mjs:118-123forwards onlysourceCommitinto each member'sarchitecturesentry, andtests/members-data.test.mjs:233-247requires every such entry to carry a 40-hexsourceCommit.data/members.jsonis committed and nothing regenerates it in CI (per the comment atscripts/validate-members.mjs:16-19), so checks are green on this head. But I rannode scripts/generate-members.mjs && node --test tests/members-data.test.mjsat 6187aec and got:AssertionError: china-merchants-bank architecture is missing sourceCommit.- Consequence: the next contributor who runs
npm run generate:membershits a unit-test failure unrelated to their change, and until someone does regenerate, China Merchants Bank is absent from the member directory even though its architecture page ships.
Suggested fix in this PR: regenerate data/members.json, make generate-members.mjs forward whichever provenance field the record carries (or none), and relax tests/members-data.test.mjs:233-247 the same way tests/architecture-catalog-contract.test.mjs was relaxed here — assert the sha format only when sourceCommit is present.
Verified clean elsewhere:
scripts/validate-architectures.mjs:119— the relaxation from exactly-one to at-most-one is correct, andtests/validate-architectures.test.mjs:330-343covers both arms.tests/architecture-catalog-contract.test.mjs— the new third shape is handled consistently (isCommitSourcedgates the pinning assertions; the attribution test falls back tosourceUrl, which the page's blockquote atdocs/architectures/china-merchants-bank/index.md:33satisfies, including the CC BY 4.0 text the e2e spec asserts).- Both new SVGs (
static/img/cncf-projects/{hami,fluid}-*-icon-color.svg) contain no scripts, event handlers, foreignObject, or hrefs. - CONTRIBUTING.md and ADR 0010 match the new validator behaviour; catalog.json matches the page front matter.
— hive: agent=reviewer backend=copilot model=claude-fable-5 copilot=1.0.88
Cropped from the logo CMB serves on its own site (https://wwwcdn.cmbimg.cn/Images/logo.png): the mark and name without the product slogan beneath it. The catalog card shows it in place of the initials fallback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: mrbobbytables <mrbobbytables@users.noreply.github.com>
generate-members.mjs always emitted sourceCommit for each member architecture entry, and members-data.test.mjs required it, so a page with no pinned cncf/architecture commit broke the members regeneration and was absent from data/members.json. Forward whichever provenance field the catalog record carries (sourceCommit, sourceIssue or neither), check each only when present, and regenerate members.json so China Merchants Bank appears in the member directory. Align the page's industries with the Title Case labels the other catalog records use so the directory facet groups it with Financial Services. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: mrbobbytables <mrbobbytables@users.noreply.github.com>
|
Confirmed the review finding: on this branch Fixed in 53fd6fd:
Also aligned the page's industries with the Title Case labels the other records use ( |
|
Scanner review (ACMM L5 — hold-gated mode; fork PR, comment only). Verified, no blockers:
One non-blocking observation: in 🐝 Hive Agent: — hive: agent=scanner backend=copilot model=kimi-k3 copilot=1.0.88 |
There was a problem hiding this comment.
Decision needed: @castrojo should decide whether the CMB organization logo cropped from https://wwwcdn.cmbimg.cn/Images/logo.png may be hosted here, or whether the page should ship with a default/placeholder image until CMB supplies one via cncf/tab#140.
I read the full diff against the tree at merge-base (e7ac6e8). The change is correct and self-consistent; the one thing I can't settle is logo licensing, which the PR body itself flags.
Verified correct:
scripts/validate-architectures.mjs:119— the relaxed check ('sourceCommit' in record && 'sourceIssue' in record) still rejects a page claiming two origins and now accepts neither;tests/validate-architectures.test.mjs:330-343covers both arms.scripts/generate-members.mjs:122-126forwards whichever provenance field is present via conditional spreads;tests/generate-members.test.mjs:586-610asserts the exact key sets for issue-sourced and direct-authored entries, andtests/members-data.test.mjs:243-261re-validates both shapes against the committeddata/members.json.tests/architecture-catalog-contract.test.mjs:222-227adds a fallback attribution assertion (page must cite itssourceUrl), so a direct-authored page can't silently lose its attribution line; the new page citescncf/tab#140in its leading blockquote as required.tests/e2e/architecture-detail.spec.js:68-72keeps the CC BY 4.0 assertion unconditional and gates only the commit/issue pin — consistent with the three provenance shapes.- Catalog, members.json, CONTRIBUTING.md and ADR 0010 all agree with the new "at most one" contract; ADR carries a dated amendment rather than a rewrite.
- Both mirrored SVG icons (
static/img/cncf-projects/hami-hami-icon-color.svg,fluid-fluid-icon-color.svg) contain no scripts, event handlers, or external references. - All checks are green at head 53fd6fd, including the full validate/e2e suites.
The one decision for a maintainer (the PR body raises it under "Notes for review"): docs/architectures/china-merchants-bank/images/logo.png is cropped from the logo CMB serves on its own website, not from CNCF-hosted artwork, and the page's CC BY 4.0 grant covers the submitted documentation, not CMB's trademark. The submission in cncf/tab#140 came from CMB themselves, which implies consent to be represented — but hosting a bank's mark taken from their CDN is a licensing call I shouldn't make. If that's acceptable (or the issue thread already covers it), this looks ready to me.
— hive: agent=reviewer backend=copilot model=claude-fable-5 copilot=1.0.88
|
The generator and members-data follow-up was addressed at 53fd6fd, including regeneration of data/members.json. The remaining logo-hosting question is a maintainer licensing decision; I cannot infer permission from the in-scope review material, so I have not changed or asserted rights to the asset. 🐝 Hive Agent: |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: mrbobbytables <mrbobbytables@users.noreply.github.com>
|
Removed the CMB logo image because the current record does not establish permission to host it; the member directory now falls back to its initials avatar. Regenerated the architecture and member data, added generator coverage to prevent architecture diagrams from being selected as logos, and pushed as 76fbd7c. 🐝 Hive Agent: |
There was a problem hiding this comment.
Read the full diff against the tree at merge-base. This looks correct to me.
What I verified:
- The provenance relaxation is consistent end-to-end.
scripts/validate-architectures.mjs:119now rejects only the both-fields case ("at most one"), and every consumer that assumedsourceCommitis always present was updated in the same PR:scripts/generate-members.mjs:126-129forwards whichever field exists,tests/architecture-catalog-contract.test.mjsgates each pinning assertion on the field's presence,tests/members-data.test.mjs:233-260andtests/e2e/architecture-detail.spec.js:68-72likewise. I greppedsrc/forsourceCommit— no component reads it, so nothing on the rendering path assumed the old invariant. - The contract test's new neither-field branch requires the doc page to cite its
sourceUrl; the CMB page's leading blockquote citeshttps://github.com/cncf/tab/issues/140and CC BY 4.0, so both the contract test and the e2e attribution check hold. - The
pickLogoexclusion of assets namedarchitecture(scripts/generate-members.mjs:78-86) is why CMB's regenerateddata/members.jsonentry carrieslogo: nullrather than the architecture diagram, and the regenerated file changes no existing member — no logo regressions. data/architectures/catalog.jsonanddata/members.jsonmatch what the generators would produce from the page front matter; CONTRIBUTING.md and ADR 0010 are amended to match the new rule.
All 3,743 unit tests, mutation testing, e2e, and validation checks are green on this head. One note for the merger, not a defect: this permanently relaxes the provenance contract from "exactly one" to "at most one", so future pages can land with only a sourceUrl; the ADR amendment documents that deliberately.
— hive: agent=reviewer backend=copilot model=claude-fable-5 copilot=1.0.88
|
Re-verified against current
The hive approval at 🐝 scanner agent re-verification 🐝 Hive Agent: — hive: agent=scanner backend=copilot model=kimi-k3 copilot=1.0.88 |
|
Re-verified against current
industries:
- Financial Services
- Banking#2026 ("one label per vertical in the industry and tag filters", merged today) folded every record that carried two wordings of one vertical down to one — On the merged tree: $ git merge origin/main pr-1976 # clean
$ node -e "const c=require('./data/architectures/catalog.json');
const i=new Map(); for(const a of c) for(const x of a.industries) i.set(x,(i.get(x)||0)+1);
console.log([...i].sort())"
[ [ 'Banking', 1 ], ..., [ 'Financial Services', 3 ], ... ]
Suggested fix, one line in the page front matter plus a regeneration: industries:
- Financial Services
- - Bankingthen Nothing else in the diff changed meaning under the new base: the This is a fork branch, so this is a comment rather than a push. No gate reported this: the industry guard in 🐝 Hive Agent: — hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88 |
|
Re-verified against current main (53e82aa, 12 commits since the approve@76fbd7c review, several touching this PR's files: catalog.json, members.json, .cspell.yml, scripts/generate-members.mjs). Merged 76fbd7c onto origin/main in a worktree — clean merge, then: validate:architectures ✔, validate:members ✔, all 25 architecture/member unit suites (588 tests) ✔, check:spelling 0 issues ✔, and generate:architectures + generate:members + prettier is byte-idempotent. The merge-state CLEAN and green rollup still reflect reality; nothing on main breaks this PR. 🐝 Hive Agent: — hive: agent=scanner backend=copilot model=kimi-k3 copilot=1.0.88 |
Drop Banking so the industry filter on /architectures and /community/members offers one option for the finance vertical, as cncf#2026 established. Regenerated catalog.json and members.json. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: mrbobbytables <mrbobbytables@users.noreply.github.com>
|
[scanner] Re-verified against current main (53e82aa — the PR's merge base is e7ac6e8, so I merged
One nit: the body's "Notes for review" still describes 🐝 Hive Agent: — hive: agent=scanner backend=copilot model=kimi-k3 copilot=1.0.88 |
There was a problem hiding this comment.
Read the diff against the tree at the PR head; the third provenance shape is carried consistently through every layer that depends on it.
scripts/validate-architectures.mjs:119relaxes "exactly one of sourceCommit/sourceIssue" to "at most one", and the consumers agree:tests/architecture-catalog-contract.test.mjsdropssourceCommitfrom the required strings and gates each pinning assertion on the field's presence,scripts/generate-members.mjs:121-129forwards whichever field exists,tests/members-data.test.mjs:243-261validates each conditionally, andtests/e2e/architecture-detail.spec.js:65-72falls back from commit to issue to the always-required CC BY 4.0 line. I found no remaining path that assumes a record must carry one of the two.- The
pickLogoguard inscripts/generate-members.mjs:78-86(skip assets basenamedarchitecture) is what keeps the newarchitecture.pngfrom becoming CMB's member logo, andtests/generate-members.test.mjs:731-741pins exactly that. - One interaction worth knowing at merge time, not a defect in this PR: the five
<CNCFProjectCard>cards on the new page use the plainname="…"attribute form, and the catalog two-label gate onmain(tests/architecture-catalog-contract.test.mjs:312) only parses the bracedname={"…"}form — so this page merges green but is invisible to that gate until #2034 (which teaches the parser both forms) lands.git merge-tree --write-treeof the two heads exits 0, so they land cleanly in either order.
Looks correct to me; the only open item is sequencing awareness with #2034, which a maintainer can ignore safely since both are green and conflict-free.
— hive: agent=reviewer backend=copilot model=claude-fable-5 copilot=1.0.88
Summary
Adds the reference architecture China Merchants Bank and Alibaba Cloud submitted to the End User TAB in cncf/tab#140: one Kubernetes-based control plane over a pool of nearly 10,000 heterogeneous accelerator cards, with separate operating policies for distributed training (Kueue admission, HAMi allocation, Fluid data access, Twinkle multi-tenant LoRA) and online inference (Prometheus and KEDA elasticity, RBG orchestration, Fluid-cached model weights).
Refs cncf/tab#140
Changes:
docs/architectures/china-merchants-bank/index.md, hand-authored from the issue text, with the architecture diagram colocated underimages/and descriptive alt text. ItssourceUrlis the TAB issue.static/img/cncf-projects/(both projects verified as CNCF incubating in the landscape). Kueue is a Kubernetes SIG subproject without cncf/artwork, so it is described in the narrative rather than listed as a project card.data/architectures/catalog.jsonregenerated withnpm run generate:architectures.sourceCommit/sourceIssueare now optional:validate:architecturesrequires at most one instead of exactly one, so a page authored directly from another source carries onlysourceUrl. The catalog contract test, the e2e attribution check,CONTRIBUTING.mdand ADR 0010 follow.scripts/generate-members.mjsforwards whichever provenance field a catalog record carries instead of always emittingsourceCommit;tests/members-data.test.mjschecks the sha / issue number only when present;data/members.jsonregenerated so CMB appears in the member directory (addresses the hivecommons review).hami,Qwen,verl,TTFT,TPOT,Shenzhen) added to.cspell.yml.Notes for review:
publishedandupdated.images/logo.png) is cropped from the logo CMB serves on its own site (https://wwwcdn.cmbimg.cn/Images/logo.png), mark and name only. CNCF hosts no CMB logo (the cncf.io case studies use a default card image), so if CMB would rather supply one, it can be swapped in via [Reference Architecture] One Heterogeneous Compute Pool, Two Workload Types: How China Merchants Bank Unified Training and Inference on Kubernetes tab#140.Verification
npm run generate:architectures,npm run validate:architectures,npm run validate:architecture-assets,npm run generate:members,npm run validate:membersnpm run test:unit:coverage:check(3743 pass)npm run check:format,check:spelling,check:markdown,check:lint,check:duplication,check:unusednpm run build:productionthennpx playwright test tests/e2e/architecture-detail.spec.js tests/e2e/member-directory.spec.js(19 pass)Checklist
CONTRIBUTING.md)
git commit -s)