Hacker DirectoryHacker Directory

WEB / WEB-10.02

From HTML to DOM,layout and paint

Follow ordinary source text through DOM,styles,geometry and frame artifacts.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mechanism

Read every scenario without motion

Visible note

  1. Authored source

    Ordinary HTML/CSS text is ready; parser output and box measurements are not yet available.

    HTML + CSS source
    Atlas & Web
    DOM + CSSOM
    DOM: absent
    Layout + draw input
    Boxes: absent
    Frame presentation
    Frame: absent
  2. DOM constructed

    The parser converts the character reference to text; the hidden node remains in the Document.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    note: Atlas & Web; hidden present
    Layout + draw input
    Boxes: pending
    Frame presentation
    Frame: absent
  3. Styles resolved

    Selected note style is block; computed color is a separate record from authored source.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    DOM + selected CSSOM rules
    Layout + draw input
    note: block; layout pending
    Frame presentation
    Frame: absent
  4. Geometry available

    The fixed border box is observed as120×24 CSS pixels; this measurement is not a paint capture.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    note text unchanged
    Layout + draw input
    note box:120×24 CSS px
    Frame presentation
    Frame: absent
  5. Painting dependency

    Layout information can feed drawing; display-list bytes are not captured in this model.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    DOM unchanged
    Layout + draw input
    Draw input selected; no capture
    Frame presentation
    Frame: pending
  6. Frame boundary

    Frame presentation is separate work; the model does not claim real pixels or GPU output.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    DOM unchanged
    Layout + draw input
    Geometry retained
    Frame presentation
    Frame candidate; pixels unmeasured

Hidden vs reserved

  1. Normal source

    Hidden and reserved nodes exist in the source; neither represents a server access decision.

    HTML + CSS source
    hidden + reserved source
    DOM + CSSOM
    DOM: absent
    Layout + draw input
    Boxes: absent
    Frame presentation
    Frame: absent
  2. Both nodes retained

    Parsing creates both nodes; a CSS display decision does not delete their DOM identity.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    hidden + reserved nodes present
    Layout + draw input
    Styles pending
    Frame presentation
    Frame: absent
  3. Different visibility rules

    Hidden uses display:none while reserved uses visibility:hidden; the effects differ.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    Nodes present; styles resolved
    Layout + draw input
    hidden:none; reserved:hidden
    Frame presentation
    Frame: absent
  4. Different box observations

    Hidden has a0×0 rectangle while reserved retains80×12; a box does not mean visible text.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    Nodes still present
    Layout + draw input
    hidden:0×0; reserved:80×12
    Frame presentation
    Visible text from these nodes: none
  5. Boundary retained

    Nonvisible data may remain in the Document; client styling does not undo delivered data.

    HTML + CSS source
    Source retained
    DOM + CSSOM
    Data present in DOM
    Layout + draw input
    Reserved space remains
    Frame presentation
    Pixels not captured

DOM text update

  1. Source retained

    Source contains Atlas & Web; ordinary parsing yields text Atlas & Web.

    HTML + CSS source
    Atlas & Web
    DOM + CSSOM
    note: Atlas & Web
    Layout + draw input
    note:120×24
    Frame presentation
    Frame: not captured
  2. Text API selected

    New plain text is selected for a local textContent update without creating a network request.

    HTML + CSS source
    Source unchanged
    DOM + CSSOM
    Pending: Atlas — revised
    Layout + draw input
    Geometry not yet reobserved
    Frame presentation
    Frame: not captured
  3. Current DOM changed

    The note current text becomes revised while the server file and original response remain unchanged.

    HTML + CSS source
    Source unchanged
    DOM + CSSOM
    note: Atlas — revised
    Layout + draw input
    Style dimensions unchanged
    Frame presentation
    Frame: pending
  4. Geometry reread

    The fixed120×24 box can be observed again; text mutation does not measure presentation timing.

    HTML + CSS source
    Source unchanged
    DOM + CSSOM
    Current DOM revised
    Layout + draw input
    note:120×24 CSS px
    Frame presentation
    Pixels still unmeasured
  5. Separate persistence gate

    The client text update is complete; this branch contains no save request or database commit.

    HTML + CSS source
    Original source retained
    DOM + CSSOM
    Local update complete
    Layout + draw input
    Fixed geometry retained
    Frame presentation
    Server persistence not claimed

ACTORS · STATE · DATA FLOW

HTML bytes are not yet a DOM

Response-body decoding supplies a character stream to the HTML parser. Tokenization produces tags, text and comments, while tree construction builds a Document from those tokens. TCP segments and HTTP DATA frames do not define DOM node boundaries. One p element may span network chunks, while one chunk can contain several elements.

The source fixture <p id="note">Atlas &amp; Web</p> makes this distinction visible: its DOM text is Atlas & Web, rather than the character-reference spelling. Inspecting parser output does not recover the original response bytes unchanged. This lesson separates the data layers of an ordinary selected input without pretending to implement every charset or streaming-parser state.

Tree construction is not a string copy

HTML has defined processing behavior for incomplete and erroneous markup. Implied html/head/body structure may appear, and a tr inside a table can cause a tbody that was absent from the source. View Source and the Elements tree can therefore differ. Follow parent/child relationships rather than visual indentation when selecting an element.

The ordinary <table><tr><td>Atlas</td></tr></table> fixture has no source tbody, yet the parser creates TBODY as table.firstElementChild. This does not make every invalid input safe for an application. Parse-error processing describes structure; input trust, application validation and output context remain separate questions. No parser-difference attack string or exploitation workflow is supplied.

The DOM is a live data model

The DOM exposes Documents and nodes as a tree-based platform model. JavaScript is a language that can use that model; the DOM is not JavaScript syntax itself. Nodes have identity, attributes and current text. Scripts can change current state while response source remains fixed. Holding a node reference does not mean a source file has been rewritten.

The native fixture sets note.textContent to Atlas — revised. That local operation replaces text children without changing the network response or server file. The scene updates its DOM card while retaining its source card. A visible client change also does not prove persistent business data was saved; save requests and server commits belong to other lessons.

CSSOM and computed style record different things

CSS parsing exposes stylesheet rules through platform objects. An authored CSSOM rule and an element’s resolved/computed style are not the same record. Selector matching, cascade, inheritance and layout-related resolved values affect the result. getComputedStyle is not the original CSS source; this fixture reads only selected width, height, color, display and visibility values.

The #note rule supplies width120px and height24px. With border-box and no padding or border, the measured size matches. #hidden uses display:none. #reserved uses visibility:hidden yet retains a box. Being present in the document tree, having a layout box and producing visible painted content are separate properties.

Render tree is a teaching shorthand

Browsers construct layout and painting data structures from document and style state. Render tree is a useful teaching shorthand, not one universally named public tree with a one-to-one DOM mapping. Chromium RenderingNG describes distinct fragment trees, property trees, display lists and compositor frames.

A hidden p in the DOM therefore need not produce a normal layout box. Pseudo-elements, anonymous boxes and text shaping also break a simple DOM=boxes equation. The model retains only selected note, hidden and reserved properties. The accessibility tree is another model; node and box observations here do not certify all accessibility behavior.

Layout, paint and frame presentation

Layout resolves sizes and positions. Paint produces drawing instructions; raster turns them into pixels or tiles; compositing and draw combine and present a frame. Chromium spreads this work across stages and threads and can skip unnecessary stages. Describing every CSS change as a mandatory complete reflow-repaint chain is misleading.

getBoundingClientRect observes border-box geometry rather than capturing paint. Measuring note width120 does not prove how its text appeared in a screenshot. The scene ends with a frame candidate and uncaptured pixels. Its animation explains dependencies rather than measuring the real browser rendering pipeline. With motion disabled, the missing and available artifacts remain readable.

2. Red · Trust & Impact

Read every scenario without motion

Hidden data

  1. The hidden node was selected in source and DOM records

    The source contains Draft under id hidden, while CSS selects display:none. hiddenNodePresent is true. Not generating a box does not imply that data never reached the client DOM.

    Source/DOM record
    Draft node present / display:none
    Interpretation/visibility
    Interpretation pending
    Data/presentation boundary
    No verdict
  2. Display control did not replace server policy

    hiddenWidth and hiddenHeight are 0, describing layout visibility. Client CSS cannot protect private data the server should not deliver. Data delivery belongs to the server; box generation belongs to the client.

    Source/DOM record
    Draft node present / display:none
    Interpretation/visibility
    Box0×0 / node still present
    Data/presentation boundary
    No verdict
  3. Invisibility was not an access denial

    Draft is benign example text, not a claimed private disclosure. The mechanism boundary is clear: not visible and not delivered are different. An invisible UI does not establish computed object authorization.

    Source/DOM record
    Draft node present / display:none
    Interpretation/visibility
    Box0×0 / node still present
    Data/presentation boundary
    Visibility hidden / access policy unmeasured
  4. The reserved box used a contrasting CSS condition

    reserved has visibility:hidden while retaining width 80 and height 12 CSS px. display:none and visibility:hidden have different geometry. Two invisible elements are not necessarily removed from DOM or layout.

    Source/DOM record
    Reserved hidden / box80×12
    Interpretation/visibility
    Box0×0 / node still present
    Data/presentation boundary
    Visibility hidden / access policy unmeasured
  5. Visibility effects retained their measurement scope

    CSS uses fixed dimensions, zero margin/padding/border and border-box. This selected geometry is not a general pixel-perfect guarantee across fonts, viewports or device-pixel ratios. Box presence is not paint capture.

    Source/DOM record
    Reserved hidden / box80×12
    Interpretation/visibility
    CSS-pixel geometry only / paint unmeasured
    Data/presentation boundary
    Visibility hidden / access policy unmeasured
  6. The control target stayed with delivered data

    When private data must not be delivered, control belongs to response policy. UI visibility and layout are tested separately. Distinguishing DOM presence, geometry and screenshot evidence prevents the wrong protection assumption.

    Source/DOM record
    Reserved hidden / box80×12
    Interpretation/visibility
    CSS-pixel geometry only / paint unmeasured
    Data/presentation boundary
    Protect delivery server-side / inspect visibility separately

Source/live DOM

  1. Original source retained its character reference

    The note source contains Atlas &amp; Web, while parsed DOM text is Atlas & Web. Source bytes and parser-produced text are different representations; current DOM serialization is not reported as the original response body.

    Source/DOM record
    Source &amp; / parsed text &
    Interpretation/visibility
    Interpretation pending
    Data/presentation boundary
    No verdict
  2. A text update was not another network response

    Expected revisedNoteText is Atlas — revised. This ordinary local text update changes the current DOM without changing the source snippet or implying another response. textContent processes plain data in a text context.

    Source/DOM record
    Source &amp; / parsed text &
    Interpretation/visibility
    Current text Atlas — revised / source retained
    Data/presentation boundary
    No verdict
  3. Parser success was not a sanitization claim

    Parsing ordinary source into a tree establishes neither authorization nor sanitization. Choosing a text API makes this update’s interpretation context explicit without guaranteeing security for every markup feature.

    Source/DOM record
    Source &amp; / parsed text &
    Interpretation/visibility
    Current text Atlas — revised / source retained
    Data/presentation boundary
    Text context explicit / broader markup policy separate
  4. An implied table node explained a source difference

    parserFixture contains tr and td within a table, with expected impliedTableChild TBODY. A parser-created node absent from source is ordinary. That tree difference alone is neither application tampering nor new network content.

    Source/DOM record
    Source table/tr / parsed table/TBODY
    Interpretation/visibility
    Current text Atlas — revised / source retained
    Data/presentation boundary
    Text context explicit / broader markup policy separate
  5. State provenance was retained with snapshots

    Source, parsed DOM and current DOM after script are compared as separate snapshots. Local DOM stages are not drawn as HTTP packets. Knowing where state changed prevents mixing response evidence with UI evidence.

    Source/DOM record
    Source table/tr / parsed table/TBODY
    Interpretation/visibility
    Source→parsed DOM→local update, distinct snapshots
    Data/presentation boundary
    Text context explicit / broader markup policy separate
  6. Source review was not a pixel or authorization verdict

    The example explains text and tree interpretation without measuring paint, GPU or the full accessibility tree. Correct DOM text is neither a server-resource grant nor identical rendered pixels across devices.

    Source/DOM record
    Source table/tr / parsed table/TBODY
    Interpretation/visibility
    Source→parsed DOM→local update, distinct snapshots
    Data/presentation boundary
    Provenance known / pixels-authz unmeasured

ASSUMPTION · BOUNDARY · CONTROL

Keep source and current DOM evidence distinct

For an authorized review, retain source, parsed DOM and post-script DOM as separate snapshots. Source Atlas &amp; Web alongside current Atlas — revised can be an ordinary local update. Reporting a current DOM serialization as the original response body loses provenance. The artifact places source and final text side by side.

Predict which child the parser adds to the table, whether display:none removes a DOM node, and whether visibility:hidden must have zero geometry. These ordinary-input questions teach interpretation. A hidden element is not automatically an access-control decision; data already delivered in a response and client CSS visibility belong to different layers.

Retain the limits of geometric measurements

Width and height can validate a selected browser fixture without proving pixel-perfect output on every device. Font, viewport, zoom and device pixel ratio have different effects. Dimensions here use fixed CSS pixels; no line-break or glyph-metric baseline is invented.

Do not draw network packets for local rendering stages. A DOM text update does not imply another response, and a display-list handoff is not HTTP. Keep present in DOM, measurable box and visible in an image as separate findings. A UI observation then retains the layer to which it belongs.

3. Blue · Secure development & defense

Read every scenario without motion

Geometry ledger

  1. Parsed text and parser nodes were selected separately

    The artifact stores authored HTML/CSS beside expected API results. In a new browser observation, the parser produces DOM text/TBODY, getComputedStyle supplies style values and getBoundingClientRect supplies CSS-pixel geometry. The expected field cannot replace that measurement; geometry cannot supply a screenshot or paint receipt either. Expected parsedNoteText is Atlas & Web and impliedTableChild TBODY. These invariants separately check text decoding and tree construction. Searching only the original source for TBODY misses the node the parser normally adds.

    DOM/CSS ledger
    Text Atlas & Web / implied TBODY
    Invariant comparison
    Interpretation pending
    Evidence verdict
    No verdict
  2. The fixed note box was compared in CSS units

    The expected note box is 120 by 24 CSS px with color rgb(15, 118, 110), zero padding and border. CSS px is not renamed as device pixels or screenshot glyph dimensions.

    DOM/CSS ledger
    Text Atlas & Web / implied TBODY
    Invariant comparison
    Note120×24 CSS px / color known
    Evidence verdict
    No verdict
  3. Two hidden conditions entered the comparison table

    hidden stays in DOM with a 0×0 box. reserved retains an 80×12 box with visibility hidden. These ordinary negative controls show that absent visible text and layout participation are different measures.

    DOM/CSS ledger
    Hidden0×0 / reserved80×12 / both nodes retained
    Invariant comparison
    Note120×24 CSS px / color known
    Evidence verdict
    No verdict
  4. The local-update invariant was not confused with source

    revisedNoteText Atlas — revised is the expected current text after script, not original response-capture bytes. Regression identifies the broken invariant rather than relabeling the whole rendering pipeline as one failure.

    DOM/CSS ledger
    Hidden0×0 / reserved80×12 / both nodes retained
    Invariant comparison
    Updated current text / original source distinct
    Evidence verdict
    No verdict
  5. The geometry verdict did not become paint capture

    paintCaptured is false. DOM and geometry observations can measure these invariants; compositor or GPU output needs a separate capture. Supplied expected DOM/box values do not imply that actual measurement was performed in this browser.

    DOM/CSS ledger
    Hidden0×0 / reserved80×12 / both nodes retained
    Invariant comparison
    Updated current text / original source distinct
    Evidence verdict
    DOM/box expectations known / paint unmeasured
  6. Regression retained minimal observable fields

    Node presence, parsed text, CSS dimensions and local-update outcomes are checked separately without collecting a full page or private content. Explaining why a state did not change retains measurement scope.

    DOM/CSS ledger
    Hidden0×0 / reserved80×12 / both nodes retained
    Invariant comparison
    Updated current text / original source distinct
    Evidence verdict
    Recheck node/text/box/update separately

Paint gap

  1. Absence of the paint record was selected explicitly

    The artifact stores authored HTML/CSS beside expected API results. In a new browser observation, the parser produces DOM text/TBODY, getComputedStyle supplies style values and getBoundingClientRect supplies CSS-pixel geometry. The expected field cannot replace that measurement; geometry cannot supply a screenshot or paint receipt either. The artifact has expected.paintCaptured false. Note dimensions and current text are known, but there is no screenshot or compositor capture. These observations answer only part of the visibility question.

    DOM/CSS ledger
    DOM/text/box known / paint capture absent
    Invariant comparison
    Interpretation pending
    Evidence verdict
    No verdict
  2. Box measurement did not replace actual pixels

    Width 120 and height 24 do not prove the exact painted text pixels. Fonts, viewport, zoom and device-pixel ratio have different effects. Geometry and screenshot evidence belong to different observer scopes.

    DOM/CSS ledger
    DOM/text/box known / paint capture absent
    Invariant comparison
    CSS geometry ≠ captured pixels
    Evidence verdict
    No verdict
  3. Benign visibility controls did not fill missing paint

    Expected display:none and visibility:hidden behavior explains ordinary CSS mechanisms. Correct source rules do not measure the entire rendered image. A normal-fixture appearance is not copied into a missing capture.

    DOM/CSS ledger
    Expected CSS effects are not screenshot evidence
    Invariant comparison
    CSS geometry ≠ captured pixels
    Evidence verdict
    No verdict
  4. Pipeline stages were separated from data transfer

    A DOM update or display-list handoff is not an HTTP exchange. Stage aliases are not a full Chromium-fragment/display-list capture. Local geometry changes do not establish new requests or server delivery.

    DOM/CSS ledger
    Expected CSS effects are not screenshot evidence
    Invariant comparison
    Local stages / no HTTP transfer inference
    Evidence verdict
    No verdict
  5. The paint verdict remained unknown

    Exact painted pixels remain UNKNOWN for this evidence. No paint capture does not prove rendering failure, and ordinary geometry is not pixel-perfect proof. The full accessibility tree likewise needs appropriate observation.

    DOM/CSS ledger
    Expected CSS effects are not screenshot evidence
    Invariant comparison
    Local stages / no HTTP transfer inference
    Evidence verdict
    UNKNOWN: exact painted pixels
  6. The new observation boundary was tied to its purpose

    Pixel questions need viewport, font/zoom context and an actual capture. DOM questions may need only scoped node/text observations. Different evidence families are not collapsed into one verified label without stating the question answered.

    DOM/CSS ledger
    Expected CSS effects are not screenshot evidence
    Invariant comparison
    Local stages / no HTTP transfer inference
    Evidence verdict
    Choose DOM or pixel evidence for the actual question

IMPLEMENTATION · SECURITY CONTROL · VERIFICATION

Place data in its intended context

The artifact stores authored HTML/CSS beside expected API results. In a new browser observation, the parser produces DOM text/TBODY, getComputedStyle supplies style values and getBoundingClientRect supplies CSS-pixel geometry. The expected field cannot replace that measurement; geometry cannot supply a screenshot or paint receipt either. Choosing a text-oriented API such as textContent makes plain-text interpretation explicit. If a product requires HTML parsing, accepted markup and trust policy need their own design. A parser producing a tree does not prove authorization or sanitization. This lesson performs an ordinary text update without claiming the guarantees taught in later output-context lessons.

Hiding private data with CSS does not undo its delivery. Server policy decides delivery; the client model decides visibility and layout. Retaining the hidden node in the artifact teaches that distinction. The learner should explain the layer to which data was delivered rather than stopping at looks hidden.

Tie checks to observable invariants

The fixture has small observable invariants: decoded character-reference text, implied TBODY, a retained hidden node, fixed note geometry and current text after mutation. Native browser APIs can observe these. Paint instructions and compositor internals require separate capture and are not evidence supplied by this test.

Prose and scene share an ordinary ledger; manual steps and reduced motion retain the source/DOM/box/frame distinction. When a UI test regresses, name the broken invariant instead of relabeling the entire pipeline. Learner acceptance also needs an explanation of which state remained unchanged and why. Browser output and learning outcome remain separate records.

NOW APPLY IT TO THE CASE

Which separate observations cover source, parsed DOM, local updates and paint?

Source Atlas &amp; Web becomes Atlas & Web in DOM, and a local update changes the text to Atlas — revised. Draft remains in DOM without a display:none box. Reserve retains space under visibility:hidden. Box geometry is not paint capture.

Order response receipt, parsing, callbacks and visible DOM outcome in the case. Try explaining the retained old title through this lesson’s browser-state distinctions.

Open the related case file ↗

READ THE EXAMPLE TOGETHER

Source / DOM / box / frame ledger

Select a field and examine what it supports and where the evidence ends.

Read the raw artifact and field explanations
{
  "htmlFragment": "<main><p id=\"note\">Atlas &amp; Web</p><p id=\"hidden\">Draft</p><p id=\"reserved\">Reserve</p></main>",
  "css": "#note{width:120px;height:24px;margin:0;padding:0;border:0;box-sizing:border-box;color:rgb(15,118,110)}#hidden{display:none}#reserved{visibility:hidden;width:80px;height:12px;margin:0;padding:0;border:0;box-sizing:border-box}",
  "parserFixture": "<table><tr><td>Atlas</td></tr></table>",
  "expected": {
    "parsedNoteText": "Atlas & Web",
    "impliedTableChild": "TBODY",
    "hiddenNodePresent": true,
    "noteWidth": 120,
    "noteHeight": 24,
    "hiddenWidth": 0,
    "hiddenHeight": 0,
    "reservedWidth": 80,
    "reservedHeight": 12,
    "reservedVisibility": "hidden",
    "noteColor": "rgb(15, 118, 110)",
    "revisedNoteText": "Atlas — revised",
    "paintCaptured": false
  },
  "measurementUnits": "CSS px;synthetic fixed style,no padding/border",
  "pipelineStages": "Instructional aliases;not full Chromium fragment/display-list capture"
}
htmlFragment
Ordinary authored source for native parsing,not a network capture.
expected.impliedTableChild
Parser-created table section absent from authored source.
expected.noteWidth
Fixed border-box geometry,not screenshot or paint evidence.
expected.paintCaptured
False: DOM/geometry is not compositor capture.

Selected ordinary HTML/CSS fixture. Source,live DOM and CSS-pixel geometry observations are not paint/GPU capture or full accessibility-tree validation.

Two reality checks

View Source and the current DOM are identical.

The parser can add implied nodes and script can change the current tree; the original response is separate evidence.

Every DOM node has a visible box.

display:none suppresses the normal box while visibility:hidden can retain one;DOM,geometry and visible pixels differ.

YOUR TURN

Work through this story.

Predict the outcome, find the evidence boundary, and explain it in your own words.

#hidden has display:none. Is the node removed from the DOM?

  1. No; the node exists, but its selected box width/height are 0.
  2. Yes; the parser removes every invisible element.
Read the explained answer

No; the node exists, but its selected box width/height are 0. — hiddenNodePresent=true; display:none produces no layout box in this fixture and does not delete the node.

What do source &amp; , parsed text & and implied TBODY show?

Selected lesson artifact fields; teaching example

htmlFragment
<main><p id="note">Atlas &amp; Web</p><p id="hidden">Draft</p><p id="reserved">Reserve</p></main>
expected.parsedNoteText
Atlas & Web
expected.impliedTableChild
TBODY
  1. The DOM is an unchanged copy of source bytes.
  2. The parser resolves character references and tree-construction rules may insert nodes.
Read the explained answer

The parser resolves character references and tree-construction rules may insert nodes. — ParsedNoteText becomes Atlas & Web; TBODY may appear in the table fixture although absent from source.

What do a visibility:hidden reserved box 80×12 and paintCaptured=false say together?

Read the explained answer

The reserved element may retain layout space while its content is not expected to be visibly painted. An 80×12 CSS-pixel rect is not an actual-pixels capture. This fixed-style example does not validate the full browser-render pipeline or compositor-frame completion.

□ I distinguished reserved space from visible content.

□ I inferred no paint completion from geometry.

Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples

MANUAL LAB

Browser Observation Lab

Predict Document, DOM/CSS, and event-loop results in 18 fields, record native Browser observations, and explain why.

Open the prediction → observation → explanation workbook ↗Source on GitHub ↗

Sources and scope