WEB / WEB-22.04
From response to pixels and the trust map
Follow Tea note through response bytes, parsed content, script/data consumption and the visible-result boundary.
1. Core · Mechanism
Read every scenario without motion
Title chain
- HTML response intent
The server prepared a fixed public shell response; the browser has neither bytes nor DOM knowledge yet.
- Server
- HTML response prepared
- Parser
- No bytes yet
- Application
- Module not started
- Text/render boundary
- Title not yet known
- HTML bytes arrived
The prepared shell reaches the browser; arrival changes only browser knowledge and the module has not run.
- Server
- HTML response prepared
- Parser
- Shell bytes received
- Application
- Module not started
- Text/render boundary
- Title not yet known
- Shell content parsed
The selected shell carries Loading plus module/style references; parsing is not a measurement of pixels.
- Server
- HTML response prepared
- Parser
- Parsed title: Loading
- Application
- Module not started
- Text/render boundary
- Title not yet known
- Module API plan
Module evaluation is a supplied fixture assumption; a separate public API request plan is prepared.
- Server
- HTML response prepared
- Parser
- Parsed title: Loading
- Application
- API request prepared
- Text/render boundary
- Title not yet known
- API received, response ready
The public GET reaches the server, which selects JSON from its fixed public fixture. This consolidated server snapshot changes only server knowledge; the consumer has not received the response yet.
- Server
- JSON response prepared
- Parser
- Parsed title: Loading
- Application
- API request prepared
- Text/render boundary
- Title not yet known
- API bytes arrived
The response reaches the consumer; status 200 does not establish title validation or a paint result.
- Server
- JSON response prepared
- Parser
- Parsed title: Loading
- Application
- JSON bytes received
- Text/render boundary
- Title not yet known
- Title schema validation
The application completes its local string check and accepts the title; the separate text consumer has not changed its own result yet.
- Server
- JSON response prepared
- Parser
- Parsed title: Loading
- Application
- String title accepted
- Text/render boundary
- Title not yet known
- Text consumer updates
The text consumer serializes Tea note from the accepted title; the application’s schema decision stays fixed, and actual browser layout/paint are not run.
- Server
- JSON response prepared
- Parser
- Parsed title: Loading
- Application
- String title accepted
- Text/render boundary
- Text: Tea note
No JS
- Shell parsing starts
The public shell contains Loading; JavaScript execution does not start in this selected branch.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- No validation yet
- Text/render boundary
- Result unknown
- Module dependency absent
The selected no-JS fixture produces no API plan; server availability cannot complete this dependency.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- API calls: 0
- Text/render boundary
- Result unknown
- Shell title retained
No new title data was consumed, so the shell’s Loading text remains unchanged.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- API calls: 0
- Text/render boundary
- Result unknown
- Visible scope bounded
Loading text is known; actual CSS/layout/paint or offline behavior have not been measured.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- API calls: 0
- Text/render boundary
- Text: Loading
Schema drift
- Public response selected
A fixed response is selected for the same public note; this local operation is not a network transfer.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- title: 7
- Text/render boundary
- Result unknown
- Compute schema decision
The title field must be a string; an ordinary type mismatch remains a distinct data error.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- String check: false
- Text/render boundary
- Result unknown
- Text result selected
An accepted title is used as text; rejected data does not change the shell heading.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- String check: false
- Text/render boundary
- Text: Loading
- Dependency boundary record
title=7 failed the string check, so the text remains Loading. No optional vendor is planned; actual DOM/layout/paint and external code execution were not observed.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- String check: false
- Text/render boundary
- Text: Loading
Vendor disabled
- Public response selected
A fixed response is selected for the same public note; this local operation is not a network transfer.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- title: Tea note
- Text/render boundary
- Result unknown
- Compute schema decision
The title field must be a string; an ordinary type mismatch remains a distinct data error.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- String check: true
- Text/render boundary
- Result unknown
- Text result selected
An accepted title is used as text; rejected data does not change the shell heading.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- String check: true
- Text/render boundary
- Text: Tea note
- Dependency boundary record
The accepted string title produces Tea note text with the optional vendor disabled. This branch shows that the title path does not need that dependency; it measures no actual pixels or external code execution.
- Server
- Public data selected
- Parser
- Shell title Loading
- Application
- String check: true
- Text/render boundary
- Text: Tea note
ACTORS · STATE · DATA FLOW
When a response reaches its next owner
WEB-22.01 followed URL and peer selection, WEB-22.02 the edge-to-service path, and WEB-22.03 the session, policy and commit boundary. Here public HTML prepared by the server reaches the browser. The same bytes now belong to a different component: the parser processes markup, application script asks for data, and rendering produces visible geometry. Preparing a result, receiving its response and seeing the current title are three distinct completion points. For Tea note, keep those points separate rather than collapsing them into one green success box.
The HTML shell contains the title Loading, stylesheet /site.css, and module /app-demo.js without async. HTML parsing creates a DOM; discovering script and style resources does not execute them. The selected module normally evaluates after document parsing; adding async changes scheduling. A classic parser-blocking script, defer script and module are not interchangeable programs. This fixture describes only the selected module branch. Style computation, layout and paint own subsequent work; a Tea note DOM title alone is not a measurement of pixels.
The API response and complete trust map
The module’s GET /api/public/notes/tea plan is a separate request from HTML navigation. A 200 JSON response does not guarantee a contract-compatible title: the body is consumed, JSON parsed and title checked as a string. In the ordinary schema-drift branch title is 7, Loading remains and the application reports a data error. A Fetch promise resolving with a response is distinct from HTTP success, body consumption and application validation. In the no-JS branch the shell is parsed but no API plan exists; service readiness cannot complete that dependency.
The complete map includes URL/origin, DNS answer, transport and peer identity, HTTP edge, route, principal, object policy, persistence and browser interpretation of data. For each arrow ask who sends, receives, owns the data and makes the decision. A third-party resource may come from another origin, yet vendor JavaScript loaded in the host page can access that page’s DOM. A third-party request is different from code isolated in a separate trust context. Here the optional vendor plan is disabled and Tea note production continues; this local design choice makes no universal offline guarantee.
2. Red · Trust & Impact
Read every scenario without motion
Schema drift
- Initial shell
The shell h1 note-title contains Loading and references style and a module. An asset reference does not prove loading or module evaluation.
- Shell and API ledger
- Shell Loading / asset references only
- Consumer contract
- Not yet evaluated
- Title/dependency outcome
- Not yet evaluated
- Normal body and contract
API status 200 and application/json body contain title Tea note. The parsed string fits the consumer contract; transport success alone does not establish type validity.
- Shell and API ledger
- Shell Loading / asset references only
- Consumer contract
- Normal title string / schema accepted
- Title/dependency outcome
- Not yet evaluated
- Numeric-title rejection
schemaDrift supplies title 7, accepted false and serializedTitle Loading. Valid JSON syntax cannot repair a wrong type; this is an ordinary contract mismatch.
- Shell and API ledger
- Shell Loading / asset references only
- Consumer contract
- Normal title string / schema accepted
- Title/dependency outcome
- title7 rejected / Loading retained
- No-JS alternative cause
noJs has zero API calls and title Loading. The same stale heading has another cause; a screenshot alone cannot identify the stopped dependency.
- Shell and API ledger
- No-JS / API0 / same Loading
- Consumer contract
- Normal title string / schema accepted
- Title/dependency outcome
- title7 rejected / Loading retained
- Final-interpreter boundary
Title is consumed as text; HTML, JS and CSS have different grammars. Same-origin body does not permit arbitrary markup interpretation or prove browser painting.
- Shell and API ledger
- No-JS / API0 / same Loading
- Consumer contract
- Data/title interpreter ≠ HTML/code permission
- Title/dependency outcome
- title7 rejected / Loading retained
- Name the effect correctly
Normal text selection is distinguished from a rejected type retaining the shell. A wrong title establishes neither corrupted server state nor an access-control violation.
- Shell and API ledger
- No-JS / API0 / same Loading
- Consumer contract
- Data/title interpreter ≠ HTML/code permission
- Title/dependency outcome
- Consumer mismatch / no inferred server corruption
Vendor boundary
- Optional code disabled
optionalVendor is unplanned yet serializedTitle is Tea note. This fixture defines a normal title path without the vendor; no external request or execution occurs.
- Shell and API ledger
- Vendor unplanned / normal title retained
- Consumer contract
- Not yet evaluated
- Title/dependency outcome
- Not yet evaluated
- Code versus data
Public style, API JSON and an executable module differ in risk. Code admitted to the host Document needs purpose/version/context review; different network origin is not automatic code isolation.
- Shell and API ledger
- Vendor unplanned / normal title retained
- Consumer contract
- Data/style/code admission scopes distinct
- Title/dependency outcome
- Not yet evaluated
- Plan is not execution
A vendor name in inventory still needs observer proof of execution. Here vendorContacted and javascriptExecuted are false; no external behavior is claimed.
- Shell and API ledger
- Vendor unplanned / normal title retained
- Consumer contract
- Data/style/code admission scopes distinct
- Title/dependency outcome
- Admission concept / vendor execution unobserved
- Follow the trust map
URL/peer, route/service, identity/persistence, parser/title and layout/paint have different owners. Completing one boundary does not automatically complete the next owner decision.
- Shell and API ledger
- Six trust edges / distinct owners
- Consumer contract
- Data/style/code admission scopes distinct
- Title/dependency outcome
- Admission concept / vendor execution unobserved
- Separate optional from critical
Vendor dependency is separated from the normal title path. This independence belongs only to the fixture, not all versions or third-party data access.
- Shell and API ledger
- Six trust edges / distinct owners
- Consumer contract
- Bounded optional-dependency independence
- Title/dependency outcome
- Admission concept / vendor execution unobserved
- Retain server authority
CORS, code approval and text binding are not object ownership. Host-code inventory and server policy stay separate; parsing grants neither user consent nor pixel success.
- Shell and API ledger
- Six trust edges / distinct owners
- Consumer contract
- Bounded optional-dependency independence
- Title/dependency outcome
- Code/data/render/server authority separate
ASSUMPTION · BOUNDARY · CONTROL
From response correctness to the visible result
The normal branch uses contract-compatible application data as a title in its document context. Its trust assumption is that server content is interpreted with the intended schema and purpose. If that assumption fails, valid JSON and a 200 can coexist with an incorrect or stale heading. The numeric title fixture is an ordinary type mismatch, not an attack input: it shows that visible results are independent of transport status. The API contract and consuming validator own the control. Visible text requires a DOM data API or suitable text serialization; HTML, JavaScript and CSS are different interpreter contexts.
If script is unavailable or evaluation stops, the browser may continue displaying the old shell. Response integrity does not establish that this dependency completed. Stale cache, a later request or the wrong selected response could yield similar appearances, so a screenshot alone cannot determine root cause. The control follows the relationship between the selected intent and response and the title revision consumed. This lesson bounds failure to rejected data and a missing dependency; an incorrect screen does not establish an access-control violation or corrupted server state.
What authority does vendor code receive?
A public stylesheet, API data and executable module are different risk objects. For executable third-party code accepted in the host document, a trust decision cannot rest only on the network destination name. The vendor, version, document context and granted runtime access matter. The relevant condition is actual loading and execution; a vendor name in a plan does not prove execution occurred. A working public title while the optional dependency is disabled establishes only this fixture’s dependency boundary.
A durable control inventories required code by purpose and owner, separates optional components from the critical title path and checks the selected version in the deployment artifact. Cross-origin data exposure and server authorization remain separate questions: CORS governs browser response access and cannot replace object ownership decisions. Third-party approval, user consent and minimization follow the application’s actual purpose. The example sends no vendor request and executes no vendor code; trust-map arrows are not a checklist for probing external systems.
3. Blue · Secure development & defense
Read every scenario without motion
Stage controls
- Response fields
Target /api/public/notes/tea, status 200, mediaType application/json and title Tea note are recorded together. Body presence alone does not establish consumer acceptance.
- Response/title ledger
- Response status/media/body known
- Stage comparison
- Not yet evaluated
- Review outcome
- Not yet evaluated
- Consumer comparison
Normal acceptance yields serializedTitle Tea note; numeric title is rejected and retains Loading. Contract decisions and text serialization remain separate results.
- Response/title ledger
- Response status/media/body known
- Stage comparison
- String accepted / number rejected / title outcomes
- Review outcome
- Not yet evaluated
- Dependency controls
No-JS retains Loading with API0; vendor-disabled retains Tea note and is unplanned. Title differences are compared with call/dependency fields to identify stages.
- Response/title ledger
- Response status/media/body known
- Stage comparison
- String accepted / number rejected / title outcomes
- Review outcome
- No-JS vs schema vs optional dependency distinct
- Pixels measurement is separate
pixelsMeasured and browserExecuted are false. Python parsing/string serialization is not presented as CSSOM, layout, paint or a user screenshot.
- Response/title ledger
- Serialized text known / browser pixels unmeasured
- Stage comparison
- String accepted / number rejected / title outcomes
- Review outcome
- No-JS vs schema vs optional dependency distinct
- Coverage-selector boundary
The schemaAccepted false selector gives zero normally and one for rejection. Missing ledger data can also yield zero, which alone does not establish healthy validation.
- Response/title ledger
- Serialized text known / browser pixels unmeasured
- Stage comparison
- Negative control retained / missing ledger unknown
- Review outcome
- No-JS vs schema vs optional dependency distinct
- Layered regression
Response, consumed revision/title and browser-visible outcome must bind to the same intent. A parser pass does not complete rendering; stages retain their own observer evidence.
- Response/title ledger
- Serialized text known / browser pixels unmeasured
- Stage comparison
- Negative control retained / missing ledger unknown
- Review outcome
- Response/consumer/render evidence independently scoped
Pixels gap
- Tea-note-string-only view
The review sees serializedTitle Tea note without DOM or pixel capture. Text in serialization does not prove the browser displayed it.
- Response/title ledger
- Serialized title known / visible output missing
- Stage comparison
- Not yet evaluated
- Review outcome
- Not yet evaluated
- Source versus live DOM
Shell Loading is initial source and normal result a later text selection. Treating a source snippet as current Elements or a screenshot hides script and layout dependencies.
- Response/title ledger
- Serialized title known / visible output missing
- Stage comparison
- Source/serialized/liveDOM/pixels distinct
- Review outcome
- Not yet evaluated
- Leave visibility unknown
Live DOM, style/layout and user-visible pixels remain UNKNOWN. A correct title string adds neither server-commit nor browser-rendering success.
- Response/title ledger
- Serialized title known / visible output missing
- Stage comparison
- Source/serialized/liveDOM/pixels distinct
- Review outcome
- DOM/layout/pixels UNKNOWN
- Required stage records
Response target/initiator, consumed title revision, active Document and rendering capture are needed. Distinct observers bind to one intent without private user data.
- Response/title ledger
- Needed: response/consumer/document/render binding
- Stage comparison
- Source/serialized/liveDOM/pixels distinct
- Review outcome
- DOM/layout/pixels UNKNOWN
- No guessed root cause
Loading or wrong appearance can arise from cache, absent script or schema drift. No vendor failure or transport error is diagnosed before identifying evidence stages.
- Response/title ledger
- Needed: response/consumer/document/render binding
- Stage comparison
- Symptom ≠ unique causal diagnosis
- Review outcome
- DOM/layout/pixels UNKNOWN
- Question for new observation
New evidence must identify the Document and title seen by the user. This record retains serialized text without inventing pixels or external-code execution.
- Response/title ledger
- Needed: response/consumer/document/render binding
- Stage comparison
- Symptom ≠ unique causal diagnosis
- Review outcome
- Retain text / collect scoped visible evidence
IMPLEMENTATION · SECURITY CONTROL · VERIFICATION
Separate evidence for bytes, DOM and pixels
In the Tea note chain the Network response body is one observation, the live Elements DOM a second, and rendering or a screenshot a third. Record the request target, initiator, response status, media type, consumed title and selected revision together. Network can expose a response without automatically knowing the application validator’s outcome; a changed Elements heading is not a server commit receipt. The local parser actually reads the heading and asset references, but browser repair rules, the script event loop, CSSOM, layout and paint are outside its scope.
The artifact’s XPath selects schemaAccepted=false only in the fixed ledger. The normal fixture yields zero and adding the ordinary type mismatch yields one. An entirely missing ledger also yields zero, which cannot establish healthy data validation. The native observation is Loading → Tea note text serialization; it is not expanded into a claim that JavaScript ran or the user saw pixels. This keeps parser, validator and rendering controls under separate owners while distinguishing a true negative from absent telemetry.
Validating the dependency branch
The no-JS baseline expects shell title Loading and zero API calls. Schema drift has an API response but a false string-title predicate. With the optional vendor disabled, the title is Tea note and no vendor request is planned. These are benign baselines, not automatic incidents. Comparisons use the same public note and selected schema. If a new revision, browser policy or user context is introduced, record that change; a previous observation does not establish correctness under new conditions.
The final defensive decision asks which boundary completed instead of merely saying the page arrived. A correct response with an old title points toward request selection and consumer state; a correct title with an incorrect appearance requires style/layout/paint evidence; authorization still belongs to server policy. This distinction makes measurements precise. Durable hardening combines consumer compatibility review for contract changes, ownership of code dependencies and appropriate browser regression evidence for the visible result. A passing parser test does not complete that last requirement.
NOW APPLY IT TO THE CASE
Do JSON, title and pixels prove the same success?
The public shell starts with Loading. Normal API JSON supplies Tea note as a string, while title 7 schema drift retains Loading. No-JS has no API call, and the normal title can be selected with the optional vendor disabled. Text serialization and browser pixels are different observation stages.
Reconstruct the owner chain from the case records. Attach each observation to its supported outcome without borrowing another request’s success for a missing hop.
Open the related case file ↗READ THE EXAMPLE TOGETHER
Tea note response/DOM/trust ledger
Select a field and examine what it supports and where the evidence ends.
Read the raw artifact and field explanations
{
"shell": "<!doctype html><html><head><link rel=\"stylesheet\" href=\"/site.css\"><script type=\"module\" src=\"/app-demo.js\"></script></head><body><h1 id=\"note-title\">Loading</h1></body></html>",
"api": {
"target": "/api/public/notes/tea",
"status": 200,
"mediaType": "application/json",
"body": "{\"id\":\"tea\",\"title\":\"Tea note\"}"
},
"normal": {
"initialTitle": "Loading",
"accepted": true,
"serializedTitle": "Tea note",
"apiCalls": 1
},
"schemaDrift": {
"title": 7,
"accepted": false,
"serializedTitle": "Loading"
},
"noJs": {
"title": "Loading",
"apiCalls": 0
},
"optionalVendor": {
"planned": false,
"serializedTitle": "Tea note"
},
"trustMap": [
{
"edge": "URL → peer → HTTP",
"owner": "browser transport context",
"priorLesson": "WEB-22.01"
},
{
"edge": "edge → route → service",
"owner": "application policy",
"priorLesson": "WEB-22.02"
},
{
"edge": "identity → policy → persistence",
"owner": "server object/transaction",
"priorLesson": "WEB-22.03"
},
{
"edge": "response → parsed content → title",
"owner": "parser and data consumer"
},
{
"edge": "title/style → layout → paint",
"owner": "browser rendering; not native observed"
},
{
"edge": "optional vendor code → host document",
"owner": "host code admission policy; disabled fixture"
}
],
"selector": {
"xml": "<audit><render schemaAccepted=\"true\"/></audit>",
"xpath": "count(/audit/render[@schemaAccepted=\"false\"])",
"expected": 0,
"positiveFixtureXml": "<audit><render schemaAccepted=\"false\"/></audit>",
"positiveExpected": 1
},
"limits": {
"browserExecuted": false,
"javascriptExecuted": false,
"httpExecuted": false,
"pixelsMeasured": false,
"vendorContacted": false
}
}- shell
- Public initial markup and asset references.
- normal/schemaDrift/noJs
- Selected consumer outcomes, not browser captures.
- trustMap
- Decision ownership and prior lesson links for data edges.
- selector
- Fixed schema-rejection ledger selector; missing data is unknown.
Synthetic public HTML/JSON. Native checks execute a Python parser, string predicate and text serialization; no browser DOM, JS, HTTP or pixels.
Two reality checks
A 200 establishes correct pixels.
Response, consumer validation, DOM and paint are separate completion points.
JavaScript from another origin is automatically isolated from the host DOM.
Vendor code executed in the host page can receive authority in that page context; resource origin alone is not execution isolation.
YOUR TURN
Work through this story.
Predict the outcome, find the evidence boundary, and explain it in your own words.
The API returned 200, but title=7. Does this consumer replace the Loading title?
- Yes. HTTP 200 makes every JSON field acceptable.
- No. accepted=false and serializedTitle=Loading.
Read the explained answer
No. accepted=false and serializedTitle=Loading. — The expected string type for title is not satisfied. The consumer withholds the rejected input from the view.
If the script does not run, does this shell already contain the Tea note title from the server?
Selected lesson artifact fields; teaching example
- shell
- <!doctype html><html><head><link rel="stylesheet" href="/site.css"><script type="module" src="/app-demo.js"></script></head><body><h1 id="note-title">Loading</h1></body></html>
- noJs.title
- Loading
- noJs.apiCalls
- 0
- No. Loading remains and there are zero API calls.
- Yes. A script tag already provides the Tea note result.
Read the explained answer
No. Loading remains and there are zero API calls. — The shell contains only Loading. Without script, this example performs neither the API request nor the later title update.
The normal branch produces serializedTitle=Tea note, but pixelsMeasured=false. Why are response-to-title and layout-to-paint separate boundaries in the trust map?
Read the explained answer
The consumer can validate data and create the title representation. Browser style, layout and paint are separate steps. This artifact shows parsing/serialization, not actual pixels: neither the browser nor JavaScript runs. The optional vendor is not planned and is not required for this title. Admitting vendor code into the host document is a separate policy decision.
□ I separated serialization from layout/paint.
□ I did not treat an optional vendor as required title data or trust evidence.
Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples
Sources and scope
- WHATWG HTML Living Standard — parsing13.2.1 Overview of the parsing model · 13.2.6 Tree construction · 13.3 Serializing HTML fragments
- WHATWG HTML — script processing4.12.1.1 Processing model · Prepare the script element
- WHATWG Fetch Living Standard5.6 Fetch methods · fetch(input, init) method steps
- MDN — How browsers workBuilding the DOM tree · Render · Style · Layout · Paint
- OWASP — Third Party JavaScript ManagementVendor JavaScript on page · JavaScript Request to Vendor
- Chrome DevTools — DOMAppendix: HTML versus the DOM · View DOM nodes
- Python 3.14 HTMLParserHTMLParser.feed(data) · HTMLParser.handle_starttag(tag, attrs) · HTMLParser.handle_data(data) · Examples
- Python 3.14 htmlhtml.escape(s, quote=True)
- RFC 9110 — HTTP Semantics3.7 Intermediaries · 15.3.1 200 OK