Refuse a sample no catalogue can reach, and seven samples for capabilities it never showed - #844
Merged
Merged
Conversation
Every gate here counts TILES, and they all read the same scan, so a sample scanSamples( ) cannot place is invisible to all of them at once. That is how fourteen samples sat in the src/ root package for two commits (#843): listed in no overview app and in no SAMPLES.md row, with thirteen green gates, because nothing that counts tiles can miss what it never scanned. Among them the only demonstrations of app_state_set_active, hash_back, _bind_path, omit_initial, check_arg_literal and t_model_skipped, and Basics IV, which left the learning path reading I, II, III, V, VI. The two skips that produce this were bare `continue`s - a class directly in src/ (the overview app lives there and must not list itself) and a class in a top-level package that is not an area. They now push onto `orphans`, returned next to `areas` and `hidden`, and check-orphan-samples.mjs refuses them. It asks the opposite question from every other gate: not whether every tile is complete, but whether every sample is a tile. Measured rather than assumed - a class planted in the root package leaves check:launchpad, check:catalogue, check:keywords and check:agents all green, and fails only this one. Being skipped by a RULE stays fine: the overview app is dropped by name before either skip, a ZZZ helper comes back under `hidden`, and a src/00/98 app is scanned, counted and listed. What is refused is a class skipped by where its file happens to sit. Wired into npm run check, into check-docs.yaml as the orphan_samples job, and into AGENTS.md sections 1, 5 and 6 - including the rule that a silent `continue` must never go back into that loop. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019rmo8XKoBEpBRZ2TZMUQrF
An audit of z2ui5_if_client against the catalogue found framework capabilities
with no sample anywhere in src/01. Seven of them close here.
513 Control Behaviour - Inline CSS on a Control (css)
the `css` pseudo-method of control_by_id: one whitelisted declaration
onto the control's own DOM node, for a value the control has no
property for (sap.m.Panel has no background-color, font-size, opacity)
514 Control Behaviour - Aggregation Item by Index
`<id>/<aggregation>/<index>` - the only way to reach a control cloned
from a bound template, since UI5 mints its id from the runtime view
prefix. A Carousel, driven the way the UI5 controller idiom does it
515 Control Behaviour - The Global Busy Indicator
control_global BUSY_INDICATOR show/hide: a singleton renders nothing
and has no id, so a global target is the only wire that reaches it
516 Browser - Keyboard Layout of an Input (inputmode)
the bound inputMode property of z2ui5.cc.InputExt - the keyboard is
model data, not an action, so switching it travels as a model update
517 File - Upload with an UploadSet
z2ui5.cc.UploadSetExt reads each added file into bound properties, so
sap.m.upload.UploadSet works without the upload endpoint it expects
518 Control Behaviour - Register an Icon Font
control_global ICON_POOL registerFont for SAP-icons-TNT. Without it
the URI renders NO GLYPH and logs nothing, which is the whole symptom
519 Basics VII - Translatable Texts (Text Elements)
ABAP's own translation instead of an i18n file, with a real TPOOL in
the abapGit sidecar. It survives the 702 downport unchanged (measured)
Three capabilities on that list are NOT here, and cannot be: control_global
INVISIBLE_MESSAGE (@SInCE 1.78), POPUP setWithinArea (1.89) and FORMATTING
set/addCustomCurrencies (1.120) are all above this repository's 1.71 floor,
and the packages that used to hold a release-restricted sample are gone (§1).
They belong in samples-stack or nowhere, not in src/01 with a disclaimer.
516, 517 and 518 are added to the `render-error` exclude list with reasons, in
the two groups that file already draws. 516/517 name a companion control the
linter's harness does not mirror (only MultiInputExt and MessageManager are, in
lib/cc-controls.mjs) - the real fix is upstream in @abap2ui5/linter. 518 hits
the same boundary one step out: the harness reconstructs the view and never
executes a frontend action, so the font registration cannot have happened while
it renders - the identical case abap2UI5/samples-controls carries as app 350.
Measured rather than assumed: swapping the control name in app 074, which is
already on the list, shows the harness is indifferent to WHICH cc control it
is, and even the mirrored MultiInputExt fails from a file that is not excluded.
The catalogue grows from 113 to 120 tiles; README, SAMPLES.md, catalogue.json,
catalogue-derived.json and the overview app are regenerated, and AGENTS.md's
category table now reads Basics I … VII.
Verified: abaplint 0 issues at v750 and Cloud, the 702 downport 0 issues in a
throwaway worktree, abap2ui5-linter 166 files 0 failing, npm run check green,
and every new file checked for the abapGit round trip (no BOM on .abap, BOM on
.xml, LF, final newline, no trailing whitespace, no line over 255).
The `" @docs` lines need the matching `samples:` frontmatter in abap2UI5/docs;
that change goes first, or check-docs-links fails here.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rmo8XKoBEpBRZ2TZMUQrF
The pairing is checked from both sides against the OTHER repository's `main` (check-docs-links here reads abap2UI5/docs at main; link-samples.mjs there reads this catalogue at main), so a new sample and its page entry cannot land together: each gate fails on what the other has not merged yet. The classes go in without their `" @docs` line, abap2UI5/docs#322 then has classes to name, and a follow-up here adds the seven lines back against a docs main that already carries them. Three green merges instead of two red ones. Generated artefacts regenerated: the `docs:` row in SAMPLES.md and the catalogue entries come off with the lines. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019rmo8XKoBEpBRZ2TZMUQrF
oblomov-dev
added a commit
that referenced
this pull request
Sep 14, 2026
The other half of the pairing abap2UI5/docs#322 declares: 513, 514, 515 and 518 at cookbook/event_navigation/frontend, 516 at browser_interaction/soft_keyboard, 517 at device_capabilities/upload_download, 519 at translation_messages/translation_i18n. The docs: rows in SAMPLES.md and the catalogue entries come back with them. A second pull request because each side checks the pairing against the OTHER repository's main, in both directions - check-docs-links here wants the page to name the class, link-samples.mjs there wants the class to point back - so the two halves can never both be green before both have merged. #844 went in without these lines to keep that side clean.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Both come out of the same audit: the catalogue was measured against
z2ui5_if_client, once for what it lists and once for what it teaches.1 —
1186f83the gate: every sample is a tileEvery gate here counts tiles, and they all read the same scan — so a sample
scanSamples( )cannot place is invisible to all of them at once. That is how the fourteen samples of #843 sat in thesrc/root package for two commits: in no overview app, in noSAMPLES.mdrow, with thirteen green gates.The two skips that produce an unplaceable class were bare
continues (a class directly insrc/, a class in a top-level package that is not an area). They now push ontoorphans, andscripts/check-orphan-samples.mjsrefuses them.Measured — a class planted in the root package, nothing removed, so no catalogue goes stale:
check:launchpad/check:catalogue/check:keywords/check:agentscheck:orphansBeing skipped by a rule stays fine: the overview app is dropped by name, a ZZZ helper comes back under
hidden, asrc/00/98app is scanned and listed. What is refused is a class skipped by where its file happens to sit.2 —
a7e3763seven samplescsspseudo-method ofcontrol_by_id— one whitelisted declaration onto the control's own DOM node, for a value the control has no property for<id>/<aggregation>/<index>— the only way to reach a control cloned from a bound template, since UI5 mints its id from the runtime view prefixcontrol_globalBUSY_INDICATOR — a singleton renders nothing and has no id, so a global target is the only wire that reaches itinputModeproperty ofz2ui5.cc.InputExt— the keyboard is model data, not an actionz2ui5.cc.UploadSetExtreads each added file into bound properties, sosap.m.upload.UploadSetworks without the upload endpoint it expectscontrol_globalICON_POOLregisterFont. Without it the URI renders no glyph and logs nothing, which is the whole symptomTPOOLin the abapGit sidecarThree capabilities on the audit list are deliberately NOT here.
INVISIBLE_MESSAGE(@SInCE 1.78),POPUP setWithinArea(1.89) andFORMATTING set/addCustomCurrencies(1.120) are all above this repository's 1.71 floor, and the packages that used to hold a release-restricted sample are gone (§1). They belong in samples-stack or nowhere — not insrc/01with a disclaimer.The three render-error excludes
516, 517 and 518 join that list with reasons, in the two groups the file already draws:
MultiInputExtandMessageManagerare, inlib/cc-controls.mjs. The real fix is upstream in@abap2ui5/linter.Measured rather than assumed: swapping the control name inside app 074, which is already on the list, shows the harness is indifferent to which cc control it is — and even the mirrored
MultiInputExtfails from a file that is not excluded.Verified
abaplint 0 issues at v750 and Cloud; the 702 downport 0 issues in a throwaway worktree (the text pool and the text symbols survive it unchanged); abap2ui5-linter 166 files, 0 failing;
npm run checkgreen; and every new file checked for the abapGit round trip — no BOM on.abap, BOM on.xml, LF, final newline, no trailing whitespace, no line over 255.Catalogue 113 → 120 tiles; README,
SAMPLES.md,catalogue.json,catalogue-derived.jsonand the overview app regenerated, and AGENTS.md's category table now readsBasics I … VII.Merge order
abap2UI5/docs#322 declares the
samples:frontmatter these seven" @docslines pair with. It has to merge first — until it does,check-docs-linksfails here, because it reads the docs checkout atmain.🤖 Generated with Claude Code
https://claude.ai/code/session_019rmo8XKoBEpBRZ2TZMUQrF