Update faq.md - #2
Merged
Merged
Conversation
Correction
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>
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.
Correction