Skip to content

Refuse a sample no catalogue can reach, and seven samples for capabilities it never showed - #844

Merged
oblomov-dev merged 3 commits into
mainfrom
claude/tender-clarke-am5979
Sep 14, 2026
Merged

oblomov-dev merged 3 commits into
mainfrom
claude/tender-clarke-am5979

Conversation

@oblomov-dev

@oblomov-dev oblomov-dev commented Sep 14, 2026

Copy link
Copy Markdown
Member

Two topics in one branch, against AGENTS.md's "one topic per PR". They were meant to be two pull requests, and I only have one branch here. Say the word and I will split the second commit onto a branch of its own — the two are independent and the split is a git reset away.

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 — 1186f83 the gate: every sample is a tile

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 the fourteen samples of #843 sat in the src/ root package for two commits: in no overview app, in no SAMPLES.md row, with thirteen green gates.

The two skips that produce an unplaceable class were bare continues (a class directly in src/, a class in a top-level package that is not an area). They now push onto orphans, and scripts/check-orphan-samples.mjs refuses them.

Measured — a class planted in the root package, nothing removed, so no catalogue goes stale:

Gate
check:launchpad / check:catalogue / check:keywords / check:agents green — blind to it
check:orphans red — caught it

Being skipped by a rule stays fine: the overview app is dropped by name, a ZZZ helper comes back under hidden, a src/00/98 app is scanned and listed. What is refused is a class skipped by where its file happens to sit.

2 — a7e3763 seven samples

513 Inline CSS on a Control 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
514 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
515 The Global Busy Indicator control_global BUSY_INDICATOR — a singleton renders nothing and has no id, so a global target is the only wire that reaches it
516 Keyboard Layout of an Input the bound inputMode property of z2ui5.cc.InputExt — the keyboard is model data, not an action
517 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 Register an Icon Font control_global ICON_POOL registerFont. Without it the URI renders no glyph and logs nothing, which is the whole symptom
519 Basics VII — Translatable Texts ABAP's own translation instead of an i18n file, with a real TPOOL in the abapGit sidecar

Three capabilities on the audit list are deliberately NOT here. 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.

The three render-error excludes

516, 517 and 518 join that list with reasons, in the two groups the 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. abap2UI5/samples-controls carries the identical case as its app 350.

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 MultiInputExt fails 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 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.

Catalogue 113 → 120 tiles; README, SAMPLES.md, catalogue.json, catalogue-derived.json and the overview app regenerated, and AGENTS.md's category table now reads Basics I … VII.

Merge order

abap2UI5/docs#322 declares the samples: frontmatter these seven " @docs lines pair with. It has to merge first — until it does, check-docs-links fails here, because it reads the docs checkout at main.

🤖 Generated with Claude Code

https://claude.ai/code/session_019rmo8XKoBEpBRZ2TZMUQrF

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
@oblomov-dev oblomov-dev changed the title Refuse a sample no catalogue can reach Refuse a sample no catalogue can reach, and seven samples for capabilities it never showed Sep 14, 2026
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
oblomov-dev merged commit 8fadb40 into main Sep 14, 2026
17 checks passed
@oblomov-dev
oblomov-dev deleted the claude/tender-clarke-am5979 branch September 14, 2026 17:06
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants