Skip to content

Update faq.md - #2

Merged
oblomov-dev merged 1 commit into
abap2UI5:mainfrom
abapsheep:patch-1
Nov 28, 2023
Merged

Update faq.md#2
oblomov-dev merged 1 commit into
abap2UI5:mainfrom
abapsheep:patch-1

Conversation

@abapsheep

Copy link
Copy Markdown
Member

Correction

Correction
@oblomov-dev
oblomov-dev merged commit d081ad2 into abap2UI5:main Nov 28, 2023
@oblomov-dev

Copy link
Copy Markdown
Member

thank you

oblomov-dev pushed a commit that referenced this pull request Aug 27, 2026
"The Cost of a Screen" had been carrying both arguments since it was renamed:
it opened on the price of a small screen and then spent half its length
walking through z2ui5_if_app and an EML call. Those are different claims for
different readers, which is why the article was 910 words and why neither half
landed.

#2 is now the structural one - what does abap2UI5 ask of the architecture you
already have, answered with the interface in full and an event handler calling
a RAP business object. #3 is the economic one - why small screens never get
built, answered with a complete job monitor and the list of steps it skips.
613 and 635 words; the merged draft was 910.

Each opens with a box naming the question it answers and linking the other, so
a reader who arrives at the wrong one finds out in a sentence.

The job monitor is a real class, not an excerpt: abaplint 0 issues against the
framework and the released API mirror, abap2ui5lint clean including
chain-house-layout. Two indentation faults were fixed on the way - a pair of
end( ) calls outside the column of the ele( ) they close, and an items
aggregation a level shallower than its own sibling.

README records the boundary and why it is load-bearing: both articles can
reach for "one class, no service", and it belongs to #2 as a contract and to
#3 as a price. If either starts making the other's argument they have merged
again.
oblomov-dev pushed a commit that referenced this pull request Sep 1, 2026
Every article now answers exactly one question, at 300-400 words of prose.
That target is half of what article 1 shipped at, and it is what forced the
splits: at this size a piece can only carry one claim, so the two-claim drafts
stopped being defensible.

What moved:

- "abap2UI5 is not a Programming Model" carried the contract AND the
  composition. Split into #2 The Whole Contract (287 words) and #3 Your RAP
  Business Object Doesn't Notice (210). The EML snippet was buried as section
  two of the old article - it is the strongest thing in the series, because it
  shows the composition instead of asserting it, and it needed its own slot.
- The Cost of a Screen moves to #4 and drops from 635 to 330. What went was
  the "two years later" section, which was a second argument wearing the first
  one's clothes.
- #5-#7 are named in the plan with the question each answers: The Roundtrip,
  PUBLIC Means Persisted, One Codebase 7.02 to ABAP Cloud.

The README records the boundary that all three published pieces will strain
against: "one class, no service" belongs to #2 as a contract, to #3 as a call
direction, and to #4 as a price. If any starts making another's argument they
have merged again.

It also records the cost of numbering. The series was resequenced once already
when RTTS moved from #2 to #1; six published numbers cannot be reordered.
oblomov-dev pushed a commit that referenced this pull request Sep 1, 2026
The split was wrong and the reason is worth writing down: "the contract is
tiny, therefore nothing below it changes" is one causal chain, not two claims.
Pulled apart, the EML half came to 210 words - a code block with a wrapper
around it, not an article.

The test that survives the mistake: two claims are separable when each has its
own reader. The contract and its consequence have the same one.

Merged and cut rather than merged and summed - 271 words against the 497 the
two halves carried. The EML snippet drops its CASE wrapper and its error
branch, because on this page it is evidence that the call is ordinary ABAP, not
a lesson in event dispatch. "What it is not" is one sentence instead of a
paragraph, and the launchpad point is a clause.

The Cost of a Screen moves back to #3, and #4-#6 shift up with it. The README
notes that the numbering has now moved twice and stops being free the moment #2
is published.
oblomov-dev pushed a commit that referenced this pull request Sep 1, 2026
The point the series was missing: there is no description step between the
ABAP class and the screen. abap2UI5 sends a UI5 XML view, so the vocabulary
is the UI5 control library rather than an annotation set that can run out.
Evidence is a complete app building a three-step sap.m.Wizard — a control
no generator produces — where every name in the chain is a UI5 name.

It carries its own cost paragraph: reaching every control is not the same
as being handed one, and nothing writes the layout.

Kept out of article 2 on the README's own separability test, which is now
written down: #2 answers what the framework wants from the architecture
below the screen, #4 answers what the screen is written in, and the two
have different readers. #2 lists "no annotations" and stops there.

Slots in at 4, pushing the three remaining ideas to 5-7. Free while only
#1 is published.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp
oblomov-dev added a commit that referenced this pull request Sep 2, 2026
…e series (#202)

* Add LinkedIn blog series drafts under blog/

Two drafts for a short "abap2UI5 Know-How" series, plus a README carrying the
series frame, the roadmap and the LinkedIn playbook.

They sit at the repository root rather than under docs/ on purpose. Everything
in docs/ is a published page: VitePress builds it, generate-llms.mjs projects
it into llms.txt, and check:examples compiles its fenced ABAP. A draft is none
of those things, and its snippets are method fragments rather than complete
classes. Nothing under blog/ is read by any of the five gates; the README says
so, and says that a draft promoted into docs/ has to pass them like any page.

Both drafts are written against the real API - z2ui5_if_app as it actually
reads, the z2ui5_cl_ui5_view_builder verbs, and z2ui5_cl_pop_table, which is
the RTTI pattern the second draft describes already shipping in the framework.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Rewrite the blog drafts as articles, with the post only introducing them

The drafts were written as feed posts with the article as an afterthought:
a hook measured against LinkedIn's "see more" cutoff, carousel outlines,
posting times, link-in-the-first-comment. That optimises for the click rather
than for the reader, which is not what this series is for.

Inverted. Each file is now the article, written at whatever length the idea
needs, followed by a short teaser post whose only job is to say what the
article is about and ask one question. The reach mechanics are gone, and the
README says they are gone on purpose so they do not creep back in.

Both articles also now state their own limits in the text - abap2UI5 has no
data model and no transactional buffer; a generic RTTI table has no contract,
and that costs something. That is what keeps the rest of the argument
credible, and the README asks the remaining drafts to keep the habit.

Nothing here is read by any of the five gates; blog/ sits outside docs/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Drop the first person and the comparison from the blog drafts

Two changes to how the series is written, both recorded in the README so the
remaining drafts inherit them.

No first person. The articles were arguing in the author's voice - "I think
that is the wrong question", "the part I want to be explicit about" - which
makes the reasoning depend on who is making it. Both articles and both teaser
posts are now impersonal; the same text can serve as documentation later
without a rewrite.

No comparison, which meant deleting the even-handedness too. The drafts named
RAP repeatedly, mostly to be fair to it, and a paragraph defending another
framework is still a paragraph about it - it invites the argument the series
exists to avoid. RAP is now named zero times. Where the incumbent approach has
to appear, the drafts describe the mechanism ("the standard path goes through
a typed service") rather than a product, and the EML snippet in article 1
stands as an unlabelled example of business logic abap2UI5 does not touch.

Article 1 is rebuilt around the problem rather than the contrast: a screen
whose cost does not scale down to the thirty lines behind it. The limits
sections stay and do the work the comparison used to - naming what abap2UI5
lacks, and what runtime typing costs, without naming anyone else.

The README also flags one unresolved tension: the title of article 1 still
frames by negation while its body no longer does.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Retitle article 1 to "The Cost of a Screen"

The old title framed by negation, and negation implies something being negated
even when nothing is named - so it kept inviting the comparison the body had
already stopped making. The new title names the problem the article is about.

Consequence worth having: with the title gone, the one remaining "programming
model" sentence had nothing left to do, and the phrase is now absent from the
piece entirely. The paragraph it introduced says what abap2UI5 asks for instead
of what it is not.

File renamed to match, README table and links updated, and the open question
about this title replaced by the reasoning as a note for the remaining drafts:
title the problem, not the contrast.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Finish the RTTI article for Tuesday and lead the series with it

Built around the three lines chosen for the piece: the title states the loss,
the closing states what changed, and the teaser post asks the question. The
draft already argued all three; it just did not put them where a reader meets
them.

Two additions that came out of using the title as the opening claim. The
problem section now says why the generic tools stayed ALV grids - not a
judgement anyone made, but a road that began with a question those tools could
not answer - which is the sentence that makes the loss accidental rather than
deliberate. And the closing says how the runtime binding avoids the problem
rather than only that it does: data typed at runtime is not a special case,
because nothing was generated from a type in the first place.

Publication order swapped. RTTI leads because it opens on something the
audience recognises before abap2UI5 is mentioned at all; the positioning piece
reads better once the framework has done something concrete. Files renumbered,
README carries the plan and the reason, and the ordering is marked as cheap to
reverse.

One rule relaxed to make the title legal: "no first person" now says no
AUTHORIAL first person. The collective "we" of "we lost RTTI" is the ABAP
community, not the writer, and passivising it would cost the sentence its
point.

Tuesday is blocked on one thing only, and the README says so at the top: the
teaser post has a [link] placeholder and no destination has been chosen yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Tighten the RTTI article to the length the idea needs

Prose down from roughly 1,100 words to 670, code untouched.

Most of it went by deleting second attempts at points already made: the
"design-time contract" section explained twice why metadata is valuable, the
cost section and the closing both listed what runtime typing gives up, and a
whole paragraph restated that ABAP has been good at this for two decades right
before the closing said the same thing better. The DDIC snippet became the
sentence it was illustrating, since z2ui5_cl_pop_table already proves the
labels work.

The three anchor lines and every argument survive; nothing was cut for space
that was doing work.

README records the target - around 600-700 words of prose - and notes that
article 2 is still at 910 and wants the same pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Add the header image for article 1, and the script that builds it

The picture is the article in one look: the dinosaur at a classic ALV grid on
the left, the sheep and the sloth at the same four rows rendered as a UI5
table on the right, and cl_abap_structdescr->get_components( ) bridging the
two under the words "columns discovered, not declared".

The mascots are the project's own brand assets, embedded from
docs/public/mascots/ and only scaled. They are not redrawn: docs/resources/
logo.md says brand art is scaled and nothing else, and a hand-traced dinosaur
would be off-brand as well as worse than the original. The two tables are
drawn in the script, since the point of the image is that they are one data
set behind two faces.

Only the PNG is committed. The intermediate SVG carries the mascots as ~480 KB
of inline base64, which makes it a build artefact rather than a source - the
script is the editable source, and it regenerates both.

The script renders a page taller than the design and crops it down. That is
not arbitrary: chromium --screenshot clips a page to less than its
--window-size height, which silently ate the footer twice before it was
measured. The docstring says so, so the next person does not rediscover it.

* Replace the RTTI fragment with a complete, gate-checked data browser

The article's payoff is now a whole class: type a table name, get its first
hundred rows of any table, columns and DDIC labels discovered by RTTI. It
replaces both the fragment and the "it is not hypothetical" section, so the
reader gets one runnable thing instead of a sketch plus a claim.

It passes the two gates check:examples runs - abaplint against the framework
and the released API mirror (0 issues), and the abap2UI5 linter for UI5 1.71
including the opt-in chain-house-layout rule. Worth the detour: a snippet on
LinkedIn cannot be corrected after the fact.

Three real errors found while writing it, all of them in prose that already
read as authoritative:

- Both drafts taught src/99. z2ui5_cl_util and z2ui5_cl_pop_table are frozen
  legacy that ships only so existing installations keep compiling, and
  teaching them is precisely what put a check:examples gate in this
  repository in the first place. The class uses plain cl_abap_* RTTI, and the
  ready-made tools are linked as addons instead.
- message_box_display takes `text`, not `val`. Article 2 had the wrong
  keyword in an otherwise correct EML example.
- The snippet reads arbitrary tables, so it needed a real S_TABU_NAM check
  rather than a warning in the prose. It has one.

Also adds the two addon links the article now earns - se16n as the full
version of the same idea, layout-management for the persistent layouts the
snippet deliberately does not attempt.

README records both rules: check the ABAP with the two gates, and never teach
a frozen class.

* Say that abap2UI5 sits next to RAP and OData, and write for the ALV veterans

The complement was the point of the series and article 1 never made it. What
it said was that runtime typing and a typed service "answer different
questions" - coexistence of use cases, not of systems. A reader does not
infer from that that these run in the same system, that a screen can call a
RAP business object, or that a freestyle UI5 team keeps its controls and adds
no frontend stack. So the article now says it, in a section of its own,
placed where the reader has just seen the mechanism work.

That required reconciling a rule that had gone too far. "Do not name other
frameworks" was written to kill the comparison and took the coexistence
statement with it - a rule that would have made the new section illegal. It
now separates the two: never compare on merit, always be explicit about what
runs next to what. Naming RAP in "an abap2UI5 screen calls it through EML" is
a fact about call direction, not a claim about which is better.

Tone follows the audience. The opening now speaks to someone who assembled a
field catalog by hand before SALV existed, and the labels paragraph calls the
result what that reader calls it. Recognition is what buys the rest.

Also fixes a measurement error of my own: article length was twice reported
counting the teaser post with the article. Measured properly the article is
761 words, inside its target, and the README now says to count the three
parts separately because the conflated number reads as a problem that is not
there.

* Rewrite article 1 on the design-time / runtime split, and correct the prose

Takes over the structure from the author's own draft, which is better than
what it replaces: the article now turns on one technical axis - when the model
is defined - instead of on a historical anecdote. That framing also makes room
for the mechanism the earlier version never stated, and which is the actual
reason any of this works: a freestyle UI5 app does not require OData at all,
a JSONModel can be filled from any HTTP endpoint, so a request is free to
carry a different model shape every time.

Language corrected throughout (design time, field catalog, know, contract,
sufficient, launchpad, and the abap2UI% typo in three places), and one
sentence rewritten rather than corrected: "RAP or Fiori Elements can not do
the job here" is a merit comparison, which the series does not make. It now
says those approaches rest on design-time metadata and are aimed at a
different problem - the same fact, without the ranking.

Adds the section the brief asked for and the draft only gestured at:
"Nothing here is exotic" says concretely that the frontend is a freestyle UI5
app with sap.m controls and a JSONModel, the backend a global ABAP class in a
transport that opens in ADT, and the deployment an ICF node whose app
registers in the launchpad next to the tiles already there. That is the
conventions argument, and it is what makes the RAP complement in the closing
land as a fact rather than a wish.

The complete data browser left the article when the snippet replaced it, so it
is kept at assets/zcl_data_browser.clas.abap and linked - a printed fragment
cannot be gate-checked, the file it was cut from can. Both gates re-run green
on it. README records that rule and widens the length band to 600-900, which
is what an article carrying a mechanism section actually costs.

* Proofread article 1 against the author's latest cut

Keeps every cut - the shortened conventions section, the modest "one of the
use cases", the dropped layout-management link - and fixes what the pass
introduced.

The visible one was in a heading: "Model Definition ad Runtime". Headings are
what a reader skims, so a typo there costs more than one in a paragraph.

The closing sentence carried the article's whole complement argument and was
the one sentence that did not parse: "no comsumer can see the difference
between the other RAP und UI5 freestyle apps" - a German conjunction, a
misspelling, and a "difference between" with only one side. It now reads "no
user can tell it from the RAP and freestyle UI5 tiles next to it", which is
the same claim, standing up.

SE11 is the dictionary maintenance transaction; the data browser people mean
when they say "show any table" is SE16 / SE16N. Named both.

Headings normalised to sentence case - three had drifted to title case, and
mixed casing in a heading list reads as carelessness.

The AUTHORITY-CHECK went out with the trimming. Put back as a clause rather
than a sentence, because the article describes a tool that reads any table in
the system and a developer reading it will paste the idea somewhere. Drop it
again if it was cut on purpose; it costs eight words.

799 words of article prose, inside the band.

* Drop the authorization check from the data browser snippet

Requested. The class header now states plainly that it reads whatever table it
is given with no authorization check, so the file is not misleading to someone
who opens it without the article, and the article's prose no longer mentions a
check that is not there.

Both gates re-run green: abaplint 0 issues against the framework and the
released API mirror, abap2ui5lint clean for UI5 1.71 including
chain-house-layout. Dropping the check also let the table name go back to a
plain string - CONV tabname( ) was only there because AUTHORITY-CHECK needs a
fixed-length field; CREATE DATA and the dynamic SELECT take the string.

* Give the data browser the Shell and nav button from sample 061

Structurally the class was already z2ui5_cl_smp_app_061 with the DDIC name
read from an input field instead of hard-coded, which is what the sample is
missing. What it did not take from 061 was the app frame: no Shell, and no
back button, so calling it from another app or from the launchpad left the
user with no way out - and the article's closing claims exactly that placement.
Both are in now, via check_app_prev_stack( ) and _event_nav_app_leave( ).

Not taken: the MessageStrip (the article is the explanation) and the editable
MultiSelect cells (a browser displays). The class header names 061 so the
relationship is findable from either side.

Both gates green.

* New header image on the design-time / runtime axis, and an RTTS footnote

The old image was ALV on the left, UI5 on the right, RTTI bridging them - the
shape of the article before it was restructured. The article now turns on when
the model is defined, so the image does too: two lanes, CDS view -> entity type
-> OData metadata above and internal table -> RTTI below, both arriving at the
same sap.m.Table. Two roads, one screen, and only one of them waits for a type.

Two defects fixed while rendering it. The lane labels overlapped their notes
because the gap was computed from a character-width estimate that is wrong for
bold uppercase with letter-spacing; the label and note are now two tspans in
one text element, so the browser lays the gap out. And the mascots hovered
above the ground band rather than standing on it.

Also answers, in the article, the question the image title invites: RTTS is the
umbrella, and this is only its read half. RTTC never appears here, because
CREATE DATA ... TYPE STANDARD TABLE OF (name) takes a DDIC name rather than a
type handle from cl_abap_structdescr=>create( ). So RTTI is the precise word,
not the loose one.

* Stop the article resting on a dynamic SELECT

The snippet never showed the SELECT, but the prose around it read as though
reading a table by name were the mechanism. It is not - it is one use of the
mechanism, and the loud one. What the binding actually needs is an internal
table; where it came from is none of its business.

So the snippet opens with a comment saying <rows> was filled somewhere above -
any SELECT, a function module, an EML read - and the prose says it outright.
That also buys the article a better bridge than SE16N to the point it makes
later: if the source can be an EML read, the RAP complement in the closing is
demonstrated rather than asserted.

The RTTS note leaned on the same thing - it contrasted RTTC against
"CREATE DATA ... TYPE STANDARD TABLE OF (name)", which only exists on the
read-a-table-by-name path. It now contrasts against what the code does at all:
nothing here builds a type, it asks what a type already is.

The data browser stays, one paragraph later, as an example rather than as the
subject.

* Drop the dynamic table access from the article and its class

The dynamic path is out: no DDIC name from an input field, no CREATE DATA on
it, no dynamic SELECT. It demos well and it is a poor thing to publish as a
pattern, because what it produces is an app that reads whatever table it is
handed.

What is actually worth showing survives intact, and reads better without it.
render_any( ) takes TYPE STANDARD TABLE, asks RTTI for the components and
derives every column and cell binding from them - so the genericity sits in
the view, where it costs nothing, instead of in the data access, where it
costs a great deal. The caller fills the table with an ordinary typed SELECT,
a function module or an EML read, and the article says so.

The signature turns out to carry the argument better than the old snippet did:
TYPE STANDARD TABLE is the shape cl_salv_table=>factory( ) has always taken,
which closes the loop with the SALV snippet the article opens on.

zcl_data_browser is replaced by zcl_rtti_table_view, the same class that is now
abap2UI5/samples#801. The article names the SE16N temptation once and says why
it is not the example, since a reader will think of it anyway. The "what it
costs" close loses a line that only described the dynamic version.

abaplint clean against the framework.

* Link the merged sample instead of keeping a copy of it here

abap2UI5/samples#801 is merged, so Z2UI5_CL_SMP_APP_497 exists as a gated
object: compiled by abaplint against standard and cloud, linted by
abap2ui5lint, downported and checked at 7.02, and rendered - on every commit
to that repository. The copy under blog/assets was the same class waiting for
that to happen, and keeping both would mean keeping them in step by hand.

That is precisely the failure this repository already runs a gate for: it
taught z2ui5_cl_xml_view on 52 pages after the framework froze it, because
prose has no compiler and a copy has no owner. So the copy goes and the
article links the sample.

README records the rule the drafting flow should follow from now on: while a
class is being written it lives in a scratch directory and is checked against
the samples repository's own gates; when it is ready it becomes a sample and
the article links that, rather than shipping a second copy here.

* Proofread article 1, and stop it promising what the linked class no longer does

The consequential correction is not a typo. The text still said "A whole data
browser - table name in, first 100 rows out" and then linked sample 497, which
has neither an input field nor a hundred rows: the dynamic version was dropped
two revisions ago. A reader who clicks finds a different program. It now
describes what the sample actually is - a table nobody described, drawn from
whatever the data turned out to be - and keeps the cl_salv_table joke, which
was the good part of that paragraph anyway.

The DDIC-label sentence had drifted the same way and is now plainly
conditional: go one step further and comp-type will tell you. Sample 497 does
not do it, because get_ddic_field( ) is not released for the cloud build.

RTTS and RTTI were used interchangeably after the headings switched to RTTS,
which reads as carelessness to the audience this is written for. Both stay,
each where it belongs - RTTS for the service in the headings and the general
claim, RTTI for the actual read - and one parenthesis says why, so the reader
does not have to wonder.

Typos: cl_salve_table (a wrong class name in a technical post is the worst kind
of typo), develope, "the the", "an UI5" three times, "showing any with RTTS",
"Doesnt this a bit look like", a capitalised It mid-sentence, and the XXXX
placeholder now points at the sample.

Image captions kept as placeholders so the file mirrors the LinkedIn draft.
896 words of article prose.

* Proofread article 1: the conclusion, and a claim I could not verify

Two broken sentences, both in the closing where they do the most damage.

"None of RTTS ever went away" does not parse - RTTS is a service, not a set of
things some of which could remain. It reads "RTTS never went away", which is
also the stronger sentence.

"was released released in ABAP Cloud from the first day" doubled the verb, and
the rest of it is a claim about release history I have no source for. That
cl_abap_structdescr IS released in ABAP Cloud is checkable and stays; "from the
first day" is dropped rather than asserted on a guess, in a post whose whole
credibility is that its facts hold.

CL_GUI_ALV_GRID replaces REUSE_ALV_GRID_DISPLAY as the author wrote it, with
the comma the compound sentence needs.

Heading case normalised to Title Case throughout. It has drifted both
directions across three passes; Title Case is what the newest headings use, so
that is the one that wins, and mixed casing in a heading list reads as
carelessness whichever way it splits.

The RTTS image caption is back in its slot, and the parenthesis naming RTTI as
the reading half now sits inline where the author put it.

* Redo the cover for the article's RTTS/RTTI split

The article now says RTTS for the service throughout and keeps RTTI for the
specific read; the cover still said RTTI in both places it names the thing.
The runtime lane is the service, so its chip is RTTS, and the closing line
quotes the article's conclusion exactly - "RTTS never went away. Only the
screen in front of it did."

The title keeps RTTI, because that is the article's title and its closing ask.
So the cover uses the two words the same way the text does, rather than picking
one and contradicting the piece it fronts.

The caption moved out of the footer. Set just above the ground band it made
three right-aligned lines within 40px of each other, which read as one crowded
block; it now sits in the empty space between the card and the ground, opposite
the mascots, and carries the weight it should at 21px.

* Proofread article 1: two sentences that do not parse, and one claim to drop

"Luckily, a UI5 apps does not actually require OData, they can also be filled
from any pure HTTP endpoint" carried four problems in one line - a singular
article on a plural noun, a verb agreeing with neither, a comma splice, and a
technical muddle: an app is not filled from an endpoint, its model is. The
JSONModel had dropped out of the sentence and taken the accuracy with it.

"a JSONModel and two-way binding and with that part of the recommended
flexible programming model" does not parse either, and what it seems to claim
should not be made: the flexible programming model is a named SAP concept for
extending Fiori elements over OData V4 with custom UI5 content. abap2UI5 uses
neither Fiori elements nor OData, so it is not part of it, and an ABAP audience
will know that. The sentence now says what is true and still worth saying -
nothing proprietary, and nothing you have not written before.

Also: the comma the ALV compound sentence needs, "In abap2UI5," with its comma,
"ABA Standard" -> ABAP Standard, "compatible to" -> the class compiling on both
(a transport is not compatible with a release), and the trailing comma that
ended that paragraph mid-thought.

* Rebuild the cover in the project's promo style, on the article's closing line

Two changes to what the cover says. It no longer repeats the headline - a
reader looking at the cover is already at the article, so the title bought
nothing there. It carries the line the article ends on instead, which is the
one worth remembering: "RTTS never went away. Only the screen in front of it
did."

And it now looks like the rest of the project's promo art rather than like a
diagram: blush gradient with a dot grid and a corner glow, the abap2UI5 mark,
a three-line headline with the red hand-drawn underline, four pill chips, a
dark editor panel with hand-tokenised ABAP highlighting, the rendered table
overlapping its corner, the mascots, and the "Open source · MIT" footer.

Three collisions found by looking at each render rather than trusting the
arithmetic, which is the only way this gets caught:

- the headline ran under the code panel and lost "it did." - it is three
  lines now, breaking after "the screen" where the sentence wants to break
  anyway;
- ENDMETHOD fell out of the panel onto the background, because 19 lines at
  17.6 leading overran a 372px panel;
- the last table row sat below its card, at 32px row pitch in a 160px card.

Each is now checked by pixel in the build, not by eye.

* Give the cover some noise

More energy without losing the code, which is still the thing worth reading on
it:

- the thin squiggle under "the screen" becomes a marker slab, tilted, white on
  red - the phrase now reads as struck through the page rather than annotated;
- the editor panel tilts -1.9 and the rendered table +2.6, so they sit on the
  page instead of in a grid;
- a "no OData!" sticker on the panel corner and a "still here!" bubble out of
  the dinosaur, which is the headline said twice more, once as a claim and once
  as a joke;
- two of the four chips fill solid, so the row has a rhythm instead of four
  identical outlines;
- a fat rotated swash behind the right half, to give the composition a
  direction.

The sticker started on the left corner, where it covered the filename and
METHOD render_any - the first line of the code the cover exists to show. It is
on the right corner now, over the empty half of the title bar.

* Put abap2UI5's own claim on the cover, not the article's last line

The cover carried "RTTS never went away. Only the screen in front of it did."
- a good line, but it never says what the thing on the page is or who made it.
Someone scrolling past learns that a service still exists.

It now carries the sentence the article makes the claim in: abap2UI5 gives
runtime-typed ABAP a UI5 face again, by binding ABAP data directly. That names
the project in the first two words, states what it does, and the marker slab
lands on "a UI5 face", which is the payoff rather than the subject.

"gives" for the article's "can give" - a cover asserts, a paragraph may hedge.
The subtitle picks up "by binding ABAP data directly", so the mechanism is not
lost with the hedge.

"still here!" out of the dinosaur keeps the line that left the headline, and
now answers "again" instead of repeating it.

* Take the sentence off the cover

The headline and its subtitle go. What is left is what was carrying the image
anyway: the mark, the code, the rendered table, the mascots, and the two
speech balloons - which say the same thing in four words each and say it
better than three lines of prose did.

Removing text is not free here, so the left column is rebuilt rather than left
with a hole. The mark becomes the hero at 222px instead of a 92px corner
badge; the chips move up under it and keep the specifics ("no entity type",
"no CDS view"); the mascots and "still here!" take the bottom. The panel
claims the room the sentence needed - 596 wide instead of 520, and the code
sets at 12.7px instead of 11.6, which is the point of the cover being legible
at feed size.

The card was left sitting 8px off the canvas edge once it moved down with the
bigger panel. Lifted, and the build now asserts all four containments rather
than trusting the arithmetic: code inside panel, card clear of the last code
line, last row inside the card, card inside the canvas.

* Align the teaser post with the article's RTTS wording

The teaser still said RTTI throughout while the article had moved to RTTS for
the service. The article has room to split the two - RTTS the umbrella, RTTI
the read - behind a parenthesis; a post read in five seconds does not, so it
uses RTTS everywhere, including the closing question.

Also marked as plain text with the [link] placeholder called out, because
LinkedIn renders no markdown and the backticks would have posted literally.

* Proofread the teaser post

Two typos in the sentence the post turns on - "exist firat designtyime" - plus
a tense slip: the paragraph says the path "goes" through a service and then
"had to exist", so it now stays in the present.

"ergänzung" was still German, "runtime types model" now reads "a runtime-typed
model", and the [link] placeholder is back: the draft said "Check out this
article" with no URL anywhere in it.

Two judgement calls, both easy to revert. "UI5, RAP and Fiori Elements" listed
UI5 next to Fiori Elements, which is UI5 - it now names the three consumption
paths the article names. And the closing question asked how to get over "the
OData bottleneck" two paragraphs after the post grants that OData is exactly
right for its job; the bottleneck is the design-time contract, not OData, so
the question says that instead and stops arguing with the post's own point.

* Record the teaser post as it went out

Nothing to correct in this pass - the draft came back clean. The file now
holds the posted wording rather than the last suggestion, so the series has
the real thing to look back on, and notes that the article URL comes from the
attached preview rather than from an inline link.

* Trim the teaser post from 858 to 744 characters

Three cuts, none of them to an argument:

- the examples list (data browsers, table maintenance, migration cockpits) -
  "a whole category of ABAP tooling" already carries it, and the article spends
  a paragraph on the examples anyway;
- "the use cases above" -> "those tools", which points at the same thing in
  three fewer words;
- "Check out this new article! 🎉" and the abap2UI5 sentence were two lines
  doing one job; they are one line now, with the emoji as the join.

What deliberately stayed is the naming of all three consumption paths. Cutting
it to "today the path goes through a typed service" would have been the easiest
50 characters in the post and the most expensive: without "freestyle UI5" in
that list, a reader answers the setup themselves - freestyle does not need
OData - and the pivot loses its force before the article can make the point.

* Split #2 into two articles that answer different questions

"The Cost of a Screen" had been carrying both arguments since it was renamed:
it opened on the price of a small screen and then spent half its length
walking through z2ui5_if_app and an EML call. Those are different claims for
different readers, which is why the article was 910 words and why neither half
landed.

#2 is now the structural one - what does abap2UI5 ask of the architecture you
already have, answered with the interface in full and an event handler calling
a RAP business object. #3 is the economic one - why small screens never get
built, answered with a complete job monitor and the list of steps it skips.
613 and 635 words; the merged draft was 910.

Each opens with a box naming the question it answers and linking the other, so
a reader who arrives at the wrong one finds out in a sentence.

The job monitor is a real class, not an excerpt: abaplint 0 issues against the
framework and the released API mirror, abap2ui5lint clean including
chain-house-layout. Two indentation faults were fixed on the way - a pair of
end( ) calls outside the column of the ele( ) they close, and an items
aggregation a level shallower than its own sibling.

README records the boundary and why it is load-bearing: both articles can
reach for "one class, no service", and it belongs to #2 as a contract and to
#3 as a price. If either starts making the other's argument they have merged
again.

* Add a reusable series cover

One image for any article in the series that does not earn its own. It carries
nothing article-specific - no RTTS, no field catalog, no flights table - and
instead shows the one mechanism every article stands on: an ABAP class
implementing one interface on the left, a UI5 freestyle view on the right, and
the two labelled arrows between them, view + model out and event + model back
over HTTP and JSON. That stays true whatever the article argues.

#KNOW-HOW is the series mark, with the # in brand red and a rule under it.

No episode number, deliberately: the post carries that, and a number in the
image is a second thing to keep in step - the picture would stop being
reusable the day article 4 exists.

The build asserts its own layout rather than trusting the arithmetic, which is
what caught the one real fault here: the gap between the two panels was 92px
and the arrow labels needed more, so "view + model" sat 8px off the UI panel
edge. The gap is 144 now, and an assertion fails the build if a label, or the
code, outgrows its box again.

* Make the series cover read as technical rather than playful

Reworked for the audience it is aimed at.

The blush gradient and dot field go: the ground is near-white with a faint
blueprint grid, red survives only on the accents - the hash, the rule, the
outbound arrow, the Save button. Shadows are lighter. The lockup is one line
now, "#KNOW-HOW" under a small letterspaced "abap2UI5 SERIES" eyebrow, at 50px
rather than 62 across two lines.

The slogan is replaced by a spec strip - interface, frontend, transport,
deploy, releases, licence - which is what an expert reads first, and the
mascots drop from 120px characters to 62px in the corner.

The wire between the panels is named: an ICF · one POST pill sitting between
the two arrows, because "what actually sits in the middle" is the first
question this audience asks of the diagram.

Dropped "No BSP", which was wrong - a BSP can be generated and the addons ship
in one. The articles' "no BSP application per app" is a different and accurate
claim and stays; the README now says why the short version must not come back.

Two alignment faults fixed by looking at the render: the rule under the
wordmark was 40px shorter than the word it underlines, and the ICF pill hung
below both arrows instead of sitting between them.

* Replace the series cover with a reading scene

The diagram version was accurate and wrong for the job. A series cover is
recognised in a feed, not read, and that one asked for a code panel, a UI
mock, two labelled arrows and a six-column spec strip before it said anything.

This one says it without words: the dinosaur deep in an open book with a
thought over its head, the sheep reading on a stack beside it, the sloth
already at the keyboard. Learn, think, build - true of every article in the
series, which is the test a reusable cover has to pass.

Three pieces of text left: #KNOW-HOW, abap2UI5 SERIES, and the domain.

The mascots stay brand art, embedded and only scaled. The shelves, stacks, open
book, desk, pendant lamp and thought bubble are drawn in the generator, so the
scene rearranges without touching an asset.

Two things the first render showed: the top centre was empty, so the lamp that
had only been a glow is now a lamp; and a single book sat alone at the right
edge, which is now a small stack beside the sloth and reads as its pile.

* Redraw the scene in one visual language

The first version put flat pastel props - tan shelves, navy and slate books, a
cream desk - around three red mascots, and the two halves never became one
picture. They were two illustrations sharing a canvas.

Everything drawn now speaks the mascots' own vocabulary: three values of the
brand red plus cream, and details KNOCKED OUT IN WHITE rather than outlined,
which is exactly how the animals are built. No prop has a dark outline, none
has a gradient, and none introduces a hue the mascots do not already contain.
The mark's circle returns as a faint halo behind the reader, which is what ties
the middle of the canvas to the brand rather than to a mood.

What is NOT redrawn is the animals. docs/resources/logo.md says brand art is
scaled and nothing else, and a hand-traced dinosaur would be off-brand as well
as worse than the original - so the unification went the other way, which is
also the direction that keeps the assets reusable.

Two faults the render showed: the lamp threw a solid white wedge that read as a
shape rather than as light, and the halo carried a stroke that cut a visible
arc through the shelf. Both are down to a fraction of their opacity.

Worth knowing: the sloth is drawn in a different style from the other two - a
dark outline and brown fur where they are flat red - and that is in the source
asset, not in this scene. Nothing here can fix it short of new brand art.

* Title and closing follow the article's RTTS wording, and a duplicated image slot goes

The heading still said RTTI while the body had moved to RTTS for the service,
and the closing call to action - reach for RTTI - contradicted 'RTTS never went
away' four lines above it. Both are RTTS now. RTTI stays only where it is the
specific read: the component names it hands back, and the parenthesis naming it
as the reading half.

The RTTS image caption appeared twice, two paragraphs apart. That was mine,
from moving the parenthesis inline a few passes ago.

* Cut the series into one-claim articles, and finish #2

Every article now answers exactly one question, at 300-400 words of prose.
That target is half of what article 1 shipped at, and it is what forced the
splits: at this size a piece can only carry one claim, so the two-claim drafts
stopped being defensible.

What moved:

- "abap2UI5 is not a Programming Model" carried the contract AND the
  composition. Split into #2 The Whole Contract (287 words) and #3 Your RAP
  Business Object Doesn't Notice (210). The EML snippet was buried as section
  two of the old article - it is the strongest thing in the series, because it
  shows the composition instead of asserting it, and it needed its own slot.
- The Cost of a Screen moves to #4 and drops from 635 to 330. What went was
  the "two years later" section, which was a second argument wearing the first
  one's clothes.
- #5-#7 are named in the plan with the question each answers: The Roundtrip,
  PUBLIC Means Persisted, One Codebase 7.02 to ABAP Cloud.

The README records the boundary that all three published pieces will strain
against: "one class, no service" belongs to #2 as a contract, to #3 as a call
direction, and to #4 as a price. If any starts making another's argument they
have merged again.

It also records the cost of numbering. The series was resequenced once already
when RTTS moved from #2 to #1; six published numbers cannot be reordered.

* Merge #2 back together and tighten it to 271 words

The split was wrong and the reason is worth writing down: "the contract is
tiny, therefore nothing below it changes" is one causal chain, not two claims.
Pulled apart, the EML half came to 210 words - a code block with a wrapper
around it, not an article.

The test that survives the mistake: two claims are separable when each has its
own reader. The contract and its consequence have the same one.

Merged and cut rather than merged and summed - 271 words against the 497 the
two halves carried. The EML snippet drops its CASE wrapper and its error
branch, because on this page it is evidence that the call is ordinary ABAP, not
a lesson in event dispatch. "What it is not" is one sentence instead of a
paragraph, and the launchpad point is a clause.

The Cost of a Screen moves back to #3, and #4-#6 shift up with it. The README
notes that the numbering has now moved twice and stops being free the moment #2
is published.

* blog: two complete apps in article 2, and a gate that actually runs

Article 2 replaces the EML fragment with two runnable applications:
zcl_travel_edit writes through a business object with EML, zcl_open_items
calls a function module. Same skeleton, different handler — which is the
point the article was making with a fragment before.

Both dispatch on the event name (IF client->get_event( ) = `SAVE`) rather
than check_on_event( ), so the abap2UI5 linter can see the handler and the
event-without-handler hints go away.

The abaplint config used rule "syntax_check", which does not exist.
abaplint ignored it and reported 0 issues for every input, garbage
included. With the real rules (parser_error, check_syntax) all three blog
classes failed: the view chains carried one closing parenthesis too many,
so the DATA(view) = ... statement never parsed. Fixed in articles 2 and 3.
Article 1 embeds no full class and is unaffected.

README records the correct rule names, why a green run proves nothing until
the gate has been made to go red on purpose, the chain-closing rule, that
EML needs v755, and that neither gate resolves z_i_travel or
Z_GET_OPEN_ITEMS — those two names are checked for shape only.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: three save handlers in article 2 — EML, table MODIFY, BAPI

One app, three ways to write the same change: MODIFY ENTITIES through a
business object, MODIFY on a database table, and BAPI_SALESORDER_CHANGE
with BAPI_TRANSACTION_COMMIT. The closing paragraph makes the point the
three are there for — the framework sees a method that ran and returned,
never what is inside it, so the same handler could as well call the EWM
classes or whatever SAP releases next.

Drops the separate zcl_open_items class: a BAPI is a function module, so
the function-module snippet is now the third handler instead of a second
full app.

README records what errorNamespace "^(Z|Y)" actually checks — ztravel_NOPE
fails, bapisdh1_NOPE passes — so the table handler is genuinely verified
against a stub TABL while the BAPI names are only parsed. Their signature
was confirmed against SAP documentation instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: add article 4, No Annotation in Between

The point the series was missing: there is no description step between the
ABAP class and the screen. abap2UI5 sends a UI5 XML view, so the vocabulary
is the UI5 control library rather than an annotation set that can run out.
Evidence is a complete app building a three-step sap.m.Wizard — a control
no generator produces — where every name in the chain is a UI5 name.

It carries its own cost paragraph: reaching every control is not the same
as being handed one, and nothing writes the layout.

Kept out of article 2 on the README's own separability test, which is now
written down: #2 answers what the framework wants from the architecture
below the screen, #4 answers what the screen is written in, and the two
have different readers. #2 lists "no annotations" and stops there.

Slots in at 4, pushing the three remaining ideas to 5-7. Free while only
#1 is published.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: map the three technical docs pages onto the series, add article 5

The series becomes the LinkedIn form of docs/technical/concept.md,
how_it_all_works.md and dx.md. README now carries a source-coverage table
that assigns every section of the three pages to exactly one article, so
nothing is lost and nothing is told twice. The plan grows to 19.

Article 5, UI5 Over-the-Wire, is the founding one the rest rests on: UI5
renders from an XML view bound to data, a view is a document, documents can
travel — so the backend sends the view as well. Shows the two strings a
response actually is.

Two things the docs pages say must not travel into an article: dx.md tells
the reader to use Z2UI5_CL_XML_VIEW while its own code uses the current
builder, and its popup section teaches z2ui5_cl_pop_to_confirm. Both are
frozen src/99 classes the framework's AGENTS.md says must never be called
from new code. That section is dropped rather than ported; the docs pages
need the same fix, which is a separate gated change under docs/.

Section 8 of how_it_all_works.md, the RAP comparison, is deliberately not
carried — the series does not compare frameworks. What it is for is argued
in article 7 on its own evidence.

SCN publishing is written down with the rule that governs it: the Rules of
Engagement allow cross-posting when the source is stated and prohibit
unattributed duplicates, so every SCN post names and links the original.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: complete the series — articles 6 to 19

The whole series now stands before anything further is published. Fourteen
new articles finish the conversion of concept.md, how_it_all_works.md and
dx.md; every row of the source-coverage table has a written article behind
it.

Length is now a rule, not a habit: 250-350 words of prose, one claim, one
piece of evidence, and the test is whether the article survives a
one-sentence summary. The new pieces run 213-324 words. Article 2 was 402
and is trimmed to 336 to match.

Each article that can carry a current-IT angle carries a different one -
fewer governed objects (7), no build pipeline to audit (11), surviving the
release migration (17), a dependency small enough to read (18), one file a
reviewer or an agent can hold (14), iteration speed deciding which ideas
get built (16). Articles 8, 13 and 15 are purely technical and stay so.

Two corrections came out of checking the snippets against the framework
rather than the docs page. Section 22 of how_it_all_works.md describes
per-request JavaScript shipping that no longer exists: custom_js is a
ty_s_http_config field set once per system through z2ui5_if_exit, and
custom controls live in their own BSP behind z2ui5_cci / z2ui5_ccc.
Article 12 documents the seams that exist now. The follow_up_action call
was also written wrongly at first and is now the shape sample 447 uses.

Every snippet is compiled, fragments included: each one is wrapped into a
real class in the scratch gate, so all 21 classes pass abaplint and the
abap2UI5 linter. Adding the missing TOGGLE handler in article 10 came from
an event-without-handler finding, not from review.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: cover cloud.md and the technology overview, articles 20 and 21

Checking the Technical Insight sidebar rather than the three pages this
started from turned up two that nothing covered.

cloud.md becomes article 20. Its best point was not carried anywhere: the
framework being ABAP Cloud compliant says nothing about the app, and the
whole difference is SELECT FROM i_salesorder against SELECT FROM vbak.
Same screen, same framework, one survives the upgrade.

technology/overview.md becomes article 21 — ITS 2000 through abap2UI5
2023, read as a line. The thought that makes it an article rather than a
list: rendering left for the browser and stays there; what has been moving
back since is the definition of the screen, first as annotations, then as
the view itself.

technology/rap.md and technology/ui5.md are NOT converted. Both are
head-to-head comparison tables and the series was set up not to compare
frameworks — the rule that already kept section 8 of how_it_all_works.md
out. README now maps their substance row by row to the articles that
already carry it positively, names what is genuinely lost (the comparative
frame and the verdict rows), and puts the three options to the owner.
Nothing is archived until that is settled.

The Toolchain group is out of scope: those pages document other people's
projects and are reference, not narrative.

Both new snippets compiled; the asks/evidence table was still on the old
numbering and now runs 2-21.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: article 22, Where the View Lives — the two comparison pages

The comparison rule is narrowed rather than dropped: a comparison is fine
when it is purely informative and shows the differences; ranking stays out.
Under that rule technology/rap.md and technology/ui5.md are converted into
one article, because both describe the same axis.

The axis is where the view is defined, and therefore when it is fixed —
build time for a UI5 freestyle project, activation time for UI annotations
read by a Fiori Elements runtime, request time for an ABAP class producing
the XML. Everything else in those two pages follows from it: what is
deployed per app, what a screen costs in artefacts, what can still change
at runtime.

What is deliberately not carried is the verdict rows both pages also have
— Learning Curve, Use Case Fit, the ✅/❌ columns. The article says why in
its own words: fixed early standardises well, fixed late adapts well, and
those are different properties rather than different amounts of one. If a
later article starts totalling points again it has crossed back over, and
README records the line so it can be checked.

All six Technical Insight pages are now drained and the section can be
archived once these drafts are published; the Toolchain group stays as
reference. The stale backlog and held-back notes are refreshed against the
finished plan.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: audit what deleting the Technical Insight pages would actually cost

Checked against the pages rather than against the coverage table, and the
answer is not yet. Every argument has an article; not every thing does.

Three blockers. The blog directory is outside docs/, so vitepress and
generate-llms see none of it — deleting the pages moves ~10,400 words of
the site's only architecture documentation to LinkedIn and SCN. Fifty
diagrams and sixty-two references are not carried against one image and
four links, and in how_it_all_works.md the diagrams are the explanation,
including animations of the model and view being swapped at runtime. Six
facts are in no article: HDA and the MPA/SPA/HDA framing, the
z2ui5_t_draft table name, expression binding and RAP's + - * side-effect
operators, VDM by name, SEGW, and the SCN backlink that makes that page a
published post.

Also recorded: hello_world.md links two of the pages in prose, the nav
config carries the whole group, and a playground test comment names dx.md.

Recommendation is archive rather than delete — keep the pages as the long
version and link the articles from them. Nothing deleted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: fold in the six missing facts and redraw nine diagrams

The facts the audit found, each in the article that should have had it:
HDA and the MPA/SPA/HDA framing in 6, z2ui5_t_draft named in 9, UI5
expression binding in 12, the Virtual Data Model by name in 20, SEGW in 7,
and the SAP Community original linked from 5 as the long version.

Expression binding was checked against the framework rather than the docs
page: {= … } is correct in an app view under the CSP abap2UI5 ships, the
linter checks it for balance, and it belongs in a backtick literal because
a string template has to escape every brace. The docs page's RAP "+ - *"
contrast is left out — unverifiable here and comparative besides.

assets/make-diagrams.py draws nine SVGs, one per article whose argument
needs a picture. SVG because these are boxes and words; each paints its own
cream card because an <img>-embedded SVG cannot see VitePress's theme
class, only prefers-color-scheme, which is wrong as soon as a reader
toggles against their system; palette is the brand's.

Rendering them caught four defects invisible in the source: a label
overflowing its box in 7, a caption off the card in 17, the legend on the
first tick in 21, two labels on top of arrows in 9.

README records what still cannot be redrawn — the animated demos of the
model and view being swapped at runtime and of the class being edited
live, and the screenshots of a real call stack, ADT completion and the
abaplint dashboard. Those exist only in the source pages, which is itself
an argument for archiving rather than deleting them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: four more diagrams — articles 10, 11, 13 and 20

Nine of twenty-two articles carried a picture; four more earn one. 10 gets
the same class rendering a table or a list, which is the closest a still
comes to the animated demo on the source page. 11 gets four deployment
steps against a method that returns a string. 13 gets the four verbs and
where each leaves the cursor — probably the most useful picture in the
series for someone meeting the builder. 20 gets reading through the
released view or straight past it.

The nine articles still without one are a decision, now written down: in
2, 3, 4, 14 and 15 the code is the argument and a diagram would restate
the listing worse; 12, 16 and 19 are lists without a shape; 1 is posted
with its own header. A diagram added because the others have one is the
wrong reason.

Also recorded, after chasing it: a screenshot window shorter than the
diagram makes the browser scale the img to fit, which looks exactly like a
card too short for its content. That was a fault in the verification, not
in 20 — render one at a time with height to spare.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* blog: two when-to-use-which articles, and drop the README

23 is RAP or abap2UI5, 24 is UI5 Freestyle or abap2UI5. Both give a plain
comparison and a recommendation, which the series had been avoiding.

23 splits on behaviour against screen: RAP when a transactional object with
validations, drafts and authorizations has more than one consumer;
abap2UI5 when the screen is the deliverable, the shape is only known at
runtime, or the release is too old for RAP. It closes on the point article
2 already makes in code — the two compose through EML, so a screen RAP
cannot shape is not a reason to give up the business object.

24 splits on where the work happens, since both reach the whole control
library: freestyle when the browser has to be smart (offline, client-side
state, genuinely interactive) or a frontend team owns its own release
cycle; abap2UI5 when the data, rules and decisions are already in ABAP and
a separate frontend project would be a second thing to maintain.

The README is removed as requested. It held the source-coverage mapping,
the gate commands and their known traps, the diagram decisions and the
archiving checklist; all of it stays in this repository's history and can
be restored from here if it is wanted back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

* Remove the Technical Insight pages, converted into the article series

The eight narrative pages under docs/technical/ are deleted at the owner's
decision: concept, dx, cloud, how_it_all_works, and technology/overview,
rap, ui5, low_code. Their text is in this repository's history and the
diagrams were never in it — all 47 are github user-attachments URLs, still
served where they are referenced elsewhere. The Toolchain group stays: it
documents other people's projects and is reference, not narrative.

Merging main first was worth it. It brought a page the series did not
cover, technology/low_code.md, now article 25 — the third when-to-use-which
after 23 (RAP) and 24 (freestyle). It also corrected a fact the series had
wrong: the draft table is Z2UI5_T_01, and z2ui5_t_draft was only ever a
working name in the old diagrams. Article 9 and its diagram said the wrong
one and would have published a table nobody can look into. And it showed
the frozen z2ui5_cl_pop_to_confirm in dx.md already replaced upstream, so
that finding needed no action.

Everything that pointed at the deleted pages goes with them: the nav group
in config.mjs, two prose links in get_started/about.md, one in
tutorials/walkthrough/step-1.md, and a stale citation in a
playground test comment whose rule is unaffected.

Eight of the nine gates pass. check:samples fails identically on untouched
origin/main against the same sibling checkout — that clone is from 24
August and CI checks out abap2UI5/samples@main explicitly, so this is not
from these changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5aUUqLaxN6kxKxsHhuicp

---------

Co-authored-by: Claude <noreply@anthropic.com>
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