Skip to content

Build the floorplans on a builder that exists, and stop the silent rot - #7

Merged
oblomov-dev merged 4 commits into
mainfrom
claude/repos-audit-optimization-n9ozlk
Aug 20, 2026
Merged

oblomov-dev merged 4 commits into
mainfrom
claude/repos-audit-optimization-n9ozlk

Conversation

@oblomov-dev

Copy link
Copy Markdown
Member

This repository does not compile on main today. Part of an audit across all thirteen abap2UI5 repositories; this was the finding that could not wait.

What was wrong

Every one of the seven floorplan classes builds its views with z2ui5_cl_ai_xml. That class ships in no repository — not in the core, not here, nowhere. abaplint reports 55 errors:

src/z2ui5_cl_rap_object_page.clas.abap[439, 21] - Class z2ui5_cl_ai_xml not found (check_syntax) [E]
src/z2ui5_cl_rap_object_page.clas.abap[486, 26] - Method "open" not found, methodCallChain (check_syntax) [E]
src/z2ui5_cl_rap_overview_page.clas.abap[67, 9] - unable to resolve z2ui5_cl_ai_xml (unknown_types) [E]
…
abaplint: 55 issue(s) found, 23 file(s) analyzed

Two things made it invisible:

  • The badge was green. The last CI run was 10 August and it passed. Since then nobody opened a pull request, and there was no scheduled run, so nothing re-checked. The break arrived from the core and was never reported.
  • The view gate was checking nothing. This is one of only two repositories that already had abap2ui5lint wired up. Because the linter only reads z2ui5_cl_ui5_view_builder, its verdict here was "no checkable app classes" — and that is a pass. Green badge, zero coverage, code that does not build.

The fix

The seven classes move to z2ui5_cl_ui5_view_builder, the core's released generic builder in src/02: open( )ele( ), leaf( )tag( ), and the as_bool( ) wrapper replaced by the attribute's own b = parameter.

Breaking for subclasses: every PROTECTED render hook that takes a builder handle (io_page, io_table, io_op, …) changes its type, and a redefining subclass has to move to the same verbs. README and AGENTS.md record it — they described the wrong builder and the verbs open/leaf/shut throughout, none of which exist.

What the gate found once it could see

With the views readable, the linter reconstructs 8 documents, 143 controls of 37 types — and reported real defects that had been hiding behind the broken reference:

  • five floorplans dispatched on check_on_init( ) alone. Nothing re-displayed when a called app handed control back, so the browser kept showing the other app's view. Each re-renders on check_on_navigated( ) now.
  • two check_on_navigated( ) branches pushed a model instead of displaying the view, which reaches nothing at that point.
  • z2ui5_cl_rap_test built its view inline in the init branch, so no other branch could call it — extracted to render_view( ).
  • z2ui5_cl_rap_overview_page cleared the card data_refs after rendering, which render_page( ) needs bound. Load, render and clear travel together in display( ) now.
  • two obsolete view_model_update( ) calls dropped, tooltips on the icon-only refresh buttons, and the unused public mv_search removed.

Keeping it from happening again

  • A weekly schedule on the check workflow. This is the change that matters most here.
  • abaplint is a devDependency now, pinned through the lockfile. It ran as npx @abaplint/cli@latest, so every run was a different check.
  • The view lint runs npx abap2ui5lint like the rest of the ecosystem, instead of a marketplace action pinned to a moving branch.
  • README badges, including the two shields.io endpoints the linter writes. A corpus badge reading "nothing checkable" would have said out loud what the green workflow badge hid.

Verification

abaplint: 55 → 0. abap2ui5lint: 7 files, 0 failing, all 8 views rendering headless.


Generated by Claude Code

oblomov-dev and others added 3 commits August 20, 2026 06:33
Every floorplan class referenced z2ui5_cl_ai_xml, a class that ships in no
repository. abaplint reported 55 errors and the addon did not compile against
abap2UI5 main; the check workflow last ran on 10 August and there is no
scheduled run, so nothing reported it.

Move the seven classes onto z2ui5_cl_ui5_view_builder, the core's released
generic builder in src/02: open( ) -> ele( ), leaf( ) -> tag( ), and the
as_bool( ) wrapper replaced by the attribute's own b = parameter.

With the views readable again the linter reconstructs all eight of them, and
it found real defects behind the broken reference:

- five floorplans dispatched on check_on_init( ) alone, so nothing re-displayed
  when a called app handed control back and the browser kept showing the other
  app's view. Each now re-renders on check_on_navigated( ).
- two check_on_navigated( ) branches pushed a model instead of displaying the
  view, which reaches nothing at that point.
- z2ui5_cl_rap_test built its view inline in the init branch; extracted to
  render_view( ) so both branches can call it.
- z2ui5_cl_rap_overview_page cleared the card data_refs after rendering, which
  render_page( ) needs bound. Load, render and clear now travel together in
  display( ).
- dropped two obsolete view_model_update( ) calls, gave the icon-only refresh
  buttons a tooltip, and removed the unused public mv_search.

abaplint reports 0 issues and abap2ui5lint no findings, with all eight views
rendering headless.

README and AGENTS.md carried the wrong builder name and the verbs
open/leaf/shut throughout; both now describe the API the core actually
releases.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhL1rra5QZbr4hV14YZXM
Three things that had drifted, and one that was never there.

**The workflows follow the naming rule again** (CONVENTIONS §2): lower kebab
case, a verb prefix that means the same in every repository, and a `name:` a
reader can trace back to the file when they see a red check. This retitles
every required status check at once - branch protection has to be moved with
it.

**A weekly run.** The sibling repositories are resolved from their main branch
with no version pin, and not one workflow here had a schedule. A rename
upstream therefore broke this repository silently and stayed broken until
somebody happened to open a pull request. rap-ext spent ten days that way with
a green badge; this is the trigger that would have caught it.

**`check` and `test`.** CONVENTIONS §3 asks every repository for both, because
they are the two commands somebody types before reading anything - and `check`
runs what CI runs, so a contributor can reproduce it. abaplint is pinned
through the lockfile, actions are pinned to a commit with the version in a
trailing comment, and Dependabot groups the updates into one pull request.

**abap2ui5lint**, which is the new one. It reads an app class and the view it
builds together, and until the views moved onto the released builder it could
not read a line of this repository. What it finds today is frozen in
abap2ui5lint-baseline.json: those entries are counted and never listed, a NEW
finding fails the gate, and an entry whose finding is gone is stale and fails
too - so the file only shrinks.

The README badge block follows the samples layout: what the addon is, then the
workflows grouped by what they prove, then two shields.io endpoints the linter
rewrites on every run. Those two exist because a green workflow badge only says
the job exited zero - which was equally true when the linter had nothing here
it could check.

abaplint ran through 'npx @abaplint/cli@latest', so every run was a different
check. It is a devDependency now, pinned through the lockfile, and the view
lint runs the same 'npx abap2ui5lint' as the rest of the ecosystem rather than
a marketplace action pinned to a moving branch.

The schedule is the point of this change for this repository in particular:
its badge stayed green for ten days while nothing here compiled.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhL1rra5QZbr4hV14YZXM
CONVENTIONS §6 asks every repository for a README, an AGENTS.md, a CLAUDE.md
pointing at it, a CONTRIBUTING.md and a SECURITY.md. Between the eleven addons
there were four AGENTS.md, no CLAUDE.md at all, no CONTRIBUTING.md at all, and
six SECURITY.md.

The CONTRIBUTING.md is the one that earns its keep: it names the gates this
repository actually has, what each one proves, and how the abap2UI5-linter
baseline works - that a recorded finding is counted and never listed, that a
new one fails, and that an entry whose finding is gone is stale and fails too,
so the file only shrinks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhL1rra5QZbr4hV14YZXM
Copilot AI lite review requested due to automatic review settings August 20, 2026 07:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

The two shields.io endpoints the linter writes were sitting in a row of their
own at the bottom, next to a check-abap2ui5 workflow badge. samples arranges
them differently, and the arrangement carries the meaning:

- the CORPUS badge belongs in the identity row, beside the namespace. "2 apps ·
  2 views · 20 controls" is what this repository IS, not what a run made of it.
- the CHECKS badge REPLACES the check-abap2ui5 workflow badge instead of
  standing beside it. A workflow badge only says the job exited zero, which was
  equally true while the linter could not read a single view here; the endpoint
  says how many rules passed, and goes grey when there is nothing to check.
  Carrying both said the weaker thing twice.

Where the linter runs as one job of a broader `check` workflow rather than in a
dedicated one, that workflow badge stays - it reports abaplint and the build
gates too, which the endpoint does not.

Also fixed while rearranging: the ABAP badge was linking to `#install` in every
repository, and only three of them have such a section. It links to the real
heading where there is one and is a plain image where there is not - a badge
whose link goes nowhere being the thing this audit was about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUhL1rra5QZbr4hV14YZXM
@oblomov-dev
oblomov-dev merged commit 9f75422 into main Aug 20, 2026
4 checks passed
@oblomov-dev
oblomov-dev deleted the claude/repos-audit-optimization-n9ozlk branch August 20, 2026 09:04
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