Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
241 commits
Select commit Hold shift + click to select a range
8305797
fix(ci): allowlist dark-launched image routes in srv-qa route-drift g…
jung-thomas Aug 18, 2026
fee503e
Merge pull request #1887 from sap-tutorials/worktree-fix-srv-qa-route…
jung-thomas Aug 18, 2026
73019ca
feat(images): heal-on-request — approuter self-populates image store …
jung-thomas Aug 18, 2026
bddcbae
fix(feedback): unblock tutorial feedback form (#1889, #1890)
jung-thomas Aug 18, 2026
91ff011
Merge pull request #1891 from sap-tutorials/worktree-heal-on-request-…
jung-thomas Aug 18, 2026
a5a07c4
Merge pull request #1892 from sap-tutorials/feedback-1889-1890
jung-thomas Aug 18, 2026
2680e67
fix(deploy): pin tutorials-srv-qa memory to 1536M
jung-thomas Aug 18, 2026
b6f2dfb
feat(devtoberfest): keyword search over sessions + fix Join banner fo…
jung-thomas Aug 18, 2026
ac11bd0
Merge pull request #1896 from sap-tutorials/worktree-search-sessions-…
jung-thomas Aug 18, 2026
e332a4d
fix(xsuaa): allow http://localhost:*/mcp-callback redirect for deskto…
jung-thomas Aug 18, 2026
768185c
Merge pull request #1898 from sap-tutorials/worktree-mcp-redirect-uri
jung-thomas Aug 18, 2026
d3832f7
feat(mcp): self-service /me/tokens PAT minting page (#1897)
jung-thomas Aug 18, 2026
1c0e228
docs(skills): add public skills/ folder for SAP AI Skills Library reg…
jung-thomas Aug 18, 2026
6ad5245
Merge pull request #1899 from sap-tutorials/worktree-pat-tokens-page
jung-thomas Aug 18, 2026
ec60e6f
Merge pull request #1894 from sap-tutorials/fix/srv-qa-memory-1536m
jung-thomas Aug 18, 2026
5650be8
Merge pull request #1900 from sap-tutorials/worktree-skills-library-p…
jung-thomas Aug 18, 2026
e8bce10
fix(ui5): map /me/tokens island to ui5-me entry so ui5-text is covere…
jung-thomas Aug 18, 2026
94e2e21
chore(release): bump MTA version to 1.17.0 for PROD release (#1902)
jung-thomas Aug 18, 2026
1b62b9c
fix(validation): stop per-question verdict badge from squishing (#190…
jung-thomas Aug 19, 2026
81308d7
fix(csrf): redirect to login on stale-session interstitial instead of…
jung-thomas Aug 19, 2026
66fe07c
feat: Devtoberfest scavenger-hunt clues on home, /ai/ and /api-docs/ …
jung-thomas Aug 19, 2026
61d5d61
fix(puzzles): wire import file-input change listener on Import press …
jung-thomas Aug 19, 2026
ad6d613
feat(petoberfest): randomize slide viewer order on mount (#1916)
jung-thomas Aug 19, 2026
985af9b
feat(petoberfest): let users withdraw their own uploaded photo
jung-thomas Aug 19, 2026
813379f
fix(petoberfest): don't show upload form to anonymous visitors (#1917)
jung-thomas Aug 19, 2026
7401d95
fix(puzzles): serve /puzzles/<slug> dynamically from CAP (#1914)
jung-thomas Aug 19, 2026
a478c14
Merge pull request #1918 from sap-tutorials/worktree-petoberfest-with…
jung-thomas Aug 19, 2026
b79254a
fix(petoberfest): JSON base64 upload to survive Akamai CDN + surface …
jung-thomas Aug 19, 2026
d251ad3
Merge pull request #1920 from sap-tutorials/worktree-petoberfest-json…
jung-thomas Aug 19, 2026
eaf2b7d
Merge pull request #1919 from sap-tutorials/worktree-puzzle-dynamic-r…
jung-thomas Aug 19, 2026
96a513b
feat(puzzle,petoberfest): admin-maintainable intro text (#1911)
jung-thomas Aug 19, 2026
a05bfc9
Merge pull request #1921 from sap-tutorials/worktree-issue-1911-intro…
jung-thomas Aug 19, 2026
12c9b51
fix(advocates): JSON base64 photo upload to survive Akamai CDN + surf…
jung-thomas Aug 19, 2026
fa19064
fix(puzzles): serve /puzzles/ section index from CAP + lock in admin …
jung-thomas Aug 19, 2026
e663934
Merge pull request #1923 from sap-tutorials/worktree-puzzle-index-and…
jung-thomas Aug 19, 2026
02c69ac
Merge pull request #1922 from sap-tutorials/worktree-advocate-json-up…
jung-thomas Aug 19, 2026
f8c0e0a
fix(ci): allowlist puzzle content routes in srv-qa route-drift guard
jung-thomas Aug 19, 2026
8474d09
Merge pull request #1924 from sap-tutorials/fix/srv-qa-puzzle-route-d…
jung-thomas Aug 19, 2026
6b45bb7
fix(author): MyOwnedTutorials includes bestPriority 1 (SAGE author-ow…
jung-thomas Aug 19, 2026
c53bab1
fix(scavenger-hunt): readable caption panel on floating clue overlays
jung-thomas Aug 19, 2026
e0371ef
Merge pull request #1925 from sap-tutorials/worktree-sage-myowned-pri1
jung-thomas Aug 19, 2026
bacb1b8
Merge pull request #1926 from sap-tutorials/worktree-scavenger-clue-r…
jung-thomas Aug 19, 2026
98ef0e0
fix(docs): ignore /me/tokens/ dead link (live app route, not a doc page)
jung-thomas Aug 19, 2026
00cbc0d
Merge pull request #1927 from sap-tutorials/worktree-fix-docs-deadlin…
jung-thomas Aug 19, 2026
5199c1d
chore(release): bump MTA version to 1.18.0 for PROD release (#1928)
jung-thomas Aug 19, 2026
bac1c64
fix(publish): bound commit memory in carryForwardUnchanged (#1932) (#…
jung-thomas Aug 20, 2026
9a332ac
fix(csrf): don't treat 4xx/5xx HTML edge errors as XSUAA session-expi…
jung-thomas Aug 20, 2026
76df7ac
fix(puzzles): toggle grid squares black/white in designer (#1930) (#1…
jung-thomas Aug 20, 2026
37181a5
fix(parser): normalise 4-space-indented fenced code blocks (#1931) (#…
jung-thomas Aug 20, 2026
51915bd
fix(catalog): use Tags.label + acronym-aware humanizer for group/miss…
jung-thomas Aug 20, 2026
e42b834
Merge pull request #1944 from sap-tutorials/worktree-fix-1937-group-t…
jung-thomas Aug 20, 2026
8abe6b6
fix(navigator): render curated Featured cards non-blank (#1941)
jung-thomas Aug 20, 2026
f34fad0
Merge pull request #1945 from sap-tutorials/worktree-fix-1941-feature…
jung-thomas Aug 20, 2026
2da635a
fix(qa): redirect QA group/mission slugs to prod URL; serve nice erro…
jung-thomas Aug 20, 2026
0b003c4
fix(build): revalidate rules.vr cache instead of trusting it blindly …
jung-thomas Aug 20, 2026
85cdd99
Merge pull request #1946 from sap-tutorials/worktree-qa-group-redirec…
jung-thomas Aug 20, 2026
87cfb88
fix(qa): client-side search in QA tutorial navigator (#1939)
jung-thomas Aug 20, 2026
232a1e4
Merge pull request #1948 from sap-tutorials/fix-1939-qa-navigator-search
jung-thomas Aug 20, 2026
a4efebf
Merge pull request #1947 from sap-tutorials/fix/rulesvr-sha-aware-cache
jung-thomas Aug 20, 2026
e0dddc9
fix(codecheck): grade reader code against the goal, not the reference…
jung-thomas Aug 20, 2026
1dd2a10
Merge pull request #1949 from sap-tutorials/fix/codecheck-grade-again…
jung-thomas Aug 20, 2026
2ca6c17
docs: add AI Skills Catalog (internal AI capabilities reference)
jung-thomas Aug 20, 2026
c600fc4
docs: design spec for group/mission completion rollup + backfill
jung-thomas Aug 20, 2026
e4a2cd9
docs: resolve scope decisions in rollup design (all item types)
jung-thomas Aug 20, 2026
c54e05f
docs: implementation plan for group/mission rollup + backfill (#1934)
jung-thomas Aug 20, 2026
b0de318
feat(rollup): pure slot model for group/mission completion
jung-thomas Aug 20, 2026
a865304
feat(rollup): mission/group membership queries + parent lookup
jung-thomas Aug 20, 2026
343a534
feat(rollup): upsert + orchestrator with NGDS edge + idempotency
jung-thomas Aug 20, 2026
f26489c
feat(rollup): wire live triggers at all completion points (#1934)
jung-thomas Aug 20, 2026
d94571b
feat(rollup): bulk backfill script (no NGDS send) (#1934)
jung-thomas Aug 20, 2026
7a59a48
feat(rollup): resumable NGDS send-through for backfilled completions …
jung-thomas Aug 20, 2026
cba482a
docs(rollup): CLAUDE.md gotcha for group/mission rollup + backfill (#…
jung-thomas Aug 20, 2026
f05a92d
Merge pull request #1951 from sap-tutorials/worktree-group-mission-ro…
jung-thomas Aug 20, 2026
030afe3
Merge pull request #1950 from sap-tutorials/worktree-ai-skills-doc
jung-thomas Aug 20, 2026
0675d62
docs: register ai-skills-catalog page in sidebar
jung-thomas Aug 20, 2026
64db777
Merge pull request #1952 from sap-tutorials/fix-docs-ai-skills-sidebar
jung-thomas Aug 20, 2026
c00a129
feat(selfie): refresh Devtoberfest backgrounds, stickers, frames + re…
jung-thomas Aug 20, 2026
18f301c
Merge pull request #1954 from sap-tutorials/selfie-asset-refresh
jung-thomas Aug 20, 2026
a279bc3
fix(parser): rescue list-continuation prose/images from indented code…
jung-thomas Aug 20, 2026
8e2d731
Merge pull request #1955 from sap-tutorials/fix/1931-image-in-codeblock
jung-thomas Aug 20, 2026
c4914eb
docs(whats-new): add 138 entries from PRs merged to DEV (2026-08-14 →…
jung-thomas Aug 20, 2026
be537dc
Merge pull request #1956 from sap-tutorials/whats-new-2026-08-20
jung-thomas Aug 20, 2026
5f46a5b
chore(release): bump MTA version to 1.18.1 for PROD release (#1957)
jung-thomas Aug 20, 2026
c1e169d
Merge main into DEV: reconcile selfie SAP-logo sticker + csrf/puzzle …
jung-thomas Aug 20, 2026
9c9aa63
Merge pull request #1959 from sap-tutorials/chore/sync-main-into-dev-…
jung-thomas Aug 20, 2026
3f8d74c
fix(#1960): reclassify contentless tutorials to DELETED
jung-thomas Aug 21, 2026
3ad2d57
Merge pull request #1961 from sap-tutorials/fix/1960-reclassify-conte…
jung-thomas Aug 21, 2026
4f2730b
fix(selfie): align background tests with renamed scene ids
jung-thomas Aug 21, 2026
a54c876
Merge pull request #1962 from sap-tutorials/worktree-fix-selfie-backg…
jung-thomas Aug 21, 2026
55ca9ef
docs: design for tutorial attachment object-store pipeline (#1931)
jung-thomas Aug 21, 2026
f5a1e80
docs: implementation plan for attachment object-store pipeline (#1931)
jung-thomas Aug 21, 2026
3e9c06c
feat(attachments): parser resolver for relative attachment links (#1931)
jung-thomas Aug 21, 2026
e575af5
fix(attachments): use negative lookbehind for image guard, strengthen…
jung-thomas Aug 21, 2026
e6dfaee
feat(tutorials): add Print / Save-as-PDF button (#1943)
jung-thomas Aug 21, 2026
30033c6
feat(attachments): wire attachment-link resolver into compose (#1931)
jung-thomas Aug 21, 2026
8b4f97e
feat(attachments): Hugo render-link hook routes attachment links to s…
jung-thomas Aug 21, 2026
45e68a2
Merge pull request #1964 from sap-tutorials/worktree-pdf-print-1943
jung-thomas Aug 21, 2026
dacd76d
feat(attachments): TutorialAssets entity (#1931)
jung-thomas Aug 21, 2026
75e7542
feat(attachments): attachment-store CRUD on TutorialAssets (#1931)
jung-thomas Aug 21, 2026
d7cabfe
feat(attachments): ext→MIME + Content-Disposition policy (#1931)
jung-thomas Aug 21, 2026
d7ed67c
fix(attachments): security hardening for attachment-mime (#1931)
jung-thomas Aug 21, 2026
e351ac8
feat(scanner): source-markdown scanner + fixer (#1963)
jung-thomas Aug 21, 2026
2de92f2
feat(attachments): warm-utils (extract + orchestrate) (#1931)
jung-thomas Aug 21, 2026
3f1c85a
feat(attachments): ingestAttachment with ext-aware MIME (#1931)
jung-thomas Aug 21, 2026
26628b6
feat(attachments): serve handler with inline/download disposition (#1…
jung-thomas Aug 21, 2026
15af3ca
feat(attachments): POST push ingest handler (#1931)
jung-thomas Aug 21, 2026
c90a578
feat(attachments): register /content/attachment-source + /content/att…
jung-thomas Aug 21, 2026
4fbbc39
feat(scanner): sync Contribution repos + batch PRs ≤10 tutorials
jung-thomas Aug 21, 2026
05846e9
feat(attachments): warm attachment store on publish (#1931)
jung-thomas Aug 21, 2026
3f5f617
feat(attachments): backfill-attachments push script (#1931)
jung-thomas Aug 21, 2026
8835716
fix(attachments): anchor GitHub token guard to exact hostname (#1931)
jung-thomas Aug 21, 2026
d80c398
chore(attachments): add attachment-* srv files to srv-qa cp list (#1931)
jung-thomas Aug 21, 2026
4e2d83d
chore(attachments): cds build artifacts + public-endpoint allowlist (…
jung-thomas Aug 21, 2026
06a401e
docs: design spec for tutorial-page display preferences (#1966)
jung-thomas Aug 21, 2026
98c8576
docs: refine display-prefs spec to extend existing tutorial-prefs isl…
jung-thomas Aug 21, 2026
6ceedae
docs: implementation plan for tutorial display preferences (#1966)
jung-thomas Aug 21, 2026
87de8b4
Merge pull request #1965 from sap-tutorials/worktree-md-source-scanne…
jung-thomas Aug 21, 2026
3192a81
feat(display-prefs): add constants + types for tutorial display prefs…
jung-thomas Aug 21, 2026
abc4472
feat(display-prefs): store getters/setters for display prefs (#1966)
jung-thomas Aug 21, 2026
a8d947a
feat(display-prefs): compute + apply effective display-chrome attribu…
jung-thomas Aug 21, 2026
7b5bce3
feat(display-prefs): auto-hide header scroll handler + live threshold…
jung-thomas Aug 21, 2026
9e5ad57
feat(display-prefs): Display section in tutorial-prefs popover + wiri…
jung-thomas Aug 21, 2026
397163e
feat(display-prefs): CSS cascade for compact/auto-hide chrome (#1966)
jung-thomas Aug 21, 2026
22d30f0
Merge pull request #1967 from sap-tutorials/worktree-attachment-objec…
jung-thomas Aug 21, 2026
9ca3196
feat(display-prefs): pre-paint effective display-chrome attributes (#…
jung-thomas Aug 21, 2026
cf9cde0
test(display-prefs): guard pre-paint + CSS hooks + threshold agreemen…
jung-thomas Aug 21, 2026
1a6b7e5
test(display-prefs): e2e for compact header + short-viewport auto pat…
jung-thomas Aug 21, 2026
192fcb5
fix(display-prefs): correct dead breadcrumbs/feedback selectors, foot…
jung-thomas Aug 21, 2026
efc0170
Merge pull request #1969 from sap-tutorials/worktree-tutorial-display…
jung-thomas Aug 21, 2026
a81b8a1
fix(hugo): add security-reviewed markers to render-link hook (#1931)
jung-thomas Aug 21, 2026
435e1c6
fix(tutorials): force-load lazy images before print (#1943)
jung-thomas Aug 21, 2026
bdcc5aa
Merge pull request #1970 from sap-tutorials/worktree-print-lazy-image…
jung-thomas Aug 21, 2026
5b3c039
fix(ui5): heal dark-mode boot-order race (island boots UI5 light befo…
jung-thomas Aug 21, 2026
68f155c
Merge pull request #1971 from sap-tutorials/worktree-fix-dark-mode-bo…
jung-thomas Aug 21, 2026
64cbef2
docs: design for KG multi-source homepage topic clusters
jung-thomas Aug 22, 2026
7d4cce1
docs: implementation plan for KG multi-source topic clusters
jung-thomas Aug 22, 2026
579c0ff
fix(tutorial-prefs): reflect stored Header pref on popover (re)open (…
jung-thomas Aug 22, 2026
1f68029
Merge pull request #1973 from sap-tutorials/worktree-fix-display-pref…
jung-thomas Aug 22, 2026
95e225a
feat: content-type registry + ranking helpers for multi-source topic …
jung-thomas Aug 22, 2026
6b73a46
perf(navigator): SSR the hero/search/filter/toolbar chrome to kill mo…
jung-thomas Aug 22, 2026
8c84309
fix: hardcoded date + add cap field + uniform shape + video statusFil…
jung-thomas Aug 22, 2026
693a4f8
Merge pull request #1974 from sap-tutorials/worktree-navigator-ssr-ch…
jung-thomas Aug 22, 2026
4614bf6
feat: shared multi-source cluster-content resolver (direct + concept-…
jung-thomas Aug 22, 2026
de76607
feat(mcp): add search_events + get_news_detail Tier 2 MCP tools
jung-thomas Aug 22, 2026
c606700
docs(prefs): design spec for tutorial reading preferences batch 2 (#1…
jung-thomas Aug 22, 2026
7d33aae
feat: bake stable multi-source items[] into /build/topic-clusters
jung-thomas Aug 22, 2026
9f50cca
Merge pull request #1975 from sap-tutorials/feat/mcp-tier2-events-news
jung-thomas Aug 22, 2026
b79eae5
fix: strengthen items[] test with stable mission member + per-card fa…
jung-thomas Aug 22, 2026
aa83406
docs(prefs): implementation plan for reading preferences batch 2 (#1966)
jung-thomas Aug 22, 2026
eb668eb
feat: /homepage/topicClusterVolatile endpoint (blogs/videos/events, E…
jung-thomas Aug 22, 2026
b0dd00a
feat(prefs): reading-prefs batch 2 store keys + getters/setters (#1966)
jung-thomas Aug 22, 2026
b6e73fb
feat(prefs): apply reading-prefs data-tut-* attrs (#1966)
jung-thomas Aug 22, 2026
1ab3f5b
feat: SSR topic-cluster band renders mixed items with type badges + i…
jung-thomas Aug 22, 2026
367b65b
feat(prefs): pre-paint reading-prefs attrs, no flash (#1966)
jung-thomas Aug 22, 2026
c97a736
feat(prefs): text size + reading width CSS (#1966)
jung-thomas Aug 22, 2026
d62fa98
feat(prefs): code size + wrap CSS (#1966)
jung-thomas Aug 22, 2026
00af020
feat(prefs): screenshot size cap + collapse CSS (#1966)
jung-thomas Aug 22, 2026
37e6641
feat: topic-clusters-band island hydrates volatile tier into homepage…
jung-thomas Aug 22, 2026
8854bb7
feat(prefs): reduce-motion CSS + prefers-reduced-motion (#1966)
jung-thomas Aug 22, 2026
f1c8f9c
fix: replace innerHTML with DOM API in renderItems to close XSS vecto…
jung-thomas Aug 22, 2026
5cb4b8c
feat(prefs): vendor OpenDyslexic + lazy @font-face (#1966)
jung-thomas Aug 22, 2026
6322caa
feat(prefs): copy-without-prompt in code copy handler (#1966)
jung-thomas Aug 22, 2026
5b6c8fc
test: advisory e2e for multi-source topic-cluster band; srv-qa cp aud…
jung-thomas Aug 22, 2026
44969f5
test(prefs): move copy-clean test to discovered unit path (#1966)
jung-thomas Aug 22, 2026
ecf2ad9
fix: reserve-minimum merge prevents volatile starvation on full SSR c…
jung-thomas Aug 22, 2026
8e2fd32
feat(prefs): reading-prefs popover rows + wiring (#1966)
jung-thomas Aug 22, 2026
22a5ced
test(prefs): E2E for reading-prefs incl. lazy-font proof (#1966)
jung-thomas Aug 22, 2026
4632326
docs: design spec for tutorial freshness detector (AI code-staleness …
jung-thomas Aug 22, 2026
41fb839
test(prefs): fix copy-clean assertion + e2e imports (#1966)
jung-thomas Aug 22, 2026
adddd21
Merge pull request #1976 from sap-tutorials/worktree-expand-topic-clu…
jung-thomas Aug 22, 2026
33613a9
docs(camera): spec for camera-input accuracy fixes + per-user calibra…
jung-thomas Aug 22, 2026
f3bf81a
fix(tutorial-prefs): drop direct @ui5 SegmentedButton imports from is…
jung-thomas Aug 22, 2026
138ae87
Merge pull request #1977 from sap-tutorials/fix/tutorial-prefs-ui5-im…
jung-thomas Aug 22, 2026
e848c44
fix(prefs): E2E selectors match live markup + read-width testid (#1966)
jung-thomas Aug 22, 2026
1cab1c3
docs: correct freshness spec (SAP AI SDK, ApiDocs/Samples embeddings,…
jung-thomas Aug 22, 2026
19da207
Merge remote-tracking branch 'origin/DEV' into feat/tutorial-reading-…
jung-thomas Aug 22, 2026
e19233a
docs(camera): implementation plan for accuracy fixes + calibration
jung-thomas Aug 22, 2026
262e22e
test(a11y): turn post-deploy axe scan into a regression gate
jung-thomas Aug 22, 2026
a44c36a
Merge pull request #1981 from sap-tutorials/feat/a11y-ratchet-gate
jung-thomas Aug 22, 2026
5d761b9
Merge pull request #1978 from sap-tutorials/feat/tutorial-reading-pre…
jung-thomas Aug 22, 2026
ffaff18
feat(camera): calibration constants, profile types, prefs-store helpers
jung-thomas Aug 22, 2026
d2286a3
docs: implementation plan for tutorial freshness detector (11 tasks, …
jung-thomas Aug 22, 2026
448792f
fix(camera): corner-anchored gaze metric + distance-normalized pitch
jung-thomas Aug 22, 2026
7e0c3fe
feat(freshness): runtime code-block extractor for tutorial steps
jung-thomas Aug 22, 2026
0c241e1
perf(prefs): subset OpenDyslexic web font ~115KB→~31KB (#1979)
jung-thomas Aug 22, 2026
2308303
Merge pull request #1982 from sap-tutorials/feat/subset-opendyslexic-…
jung-thomas Aug 22, 2026
8eb7ee2
a11y: exclude 3rd-party TrustArc banner from scan; make nav-progress …
jung-thomas Aug 22, 2026
cd2b661
fix(camera): scope mediapipe mock alias to unit project only (not glo…
jung-thomas Aug 22, 2026
9046b5e
feat(freshness): data model, ApiDocs/Samples embedding columns, proje…
jung-thomas Aug 22, 2026
d48d211
Merge pull request #1983 from sap-tutorials/feat/a11y-fixes-region
jung-thomas Aug 22, 2026
06ba2a1
fix(camera): remove unnecessary mediapipe mock; hugo-apps install res…
jung-thomas Aug 22, 2026
ccd5567
feat(freshness): backfill job for ApiDocs/Samples embeddings
jung-thomas Aug 22, 2026
da7f739
a11y: fix advocate flip card + video-band redundant alt
jung-thomas Aug 22, 2026
46bbb80
fix(camera): GazeDetector threshold injection, dwell grace, EMA smoot…
jung-thomas Aug 22, 2026
dc5224d
Merge pull request #1984 from sap-tutorials/feat/a11y-advocates-video…
jung-thomas Aug 22, 2026
1f707e8
feat(freshness): grounding helper (cosine over ApiDocs/Samples)
jung-thomas Aug 22, 2026
96202f9
fix(camera): tolerant radial palm gate + mirrored swipe direction
jung-thomas Aug 22, 2026
2ec5d9d
fix(camera): SwipeDetector trailing-buffer motion model + threshold i…
jung-thomas Aug 22, 2026
652f303
feat(freshness): detection engine (forced-tool-call LLM + grounding +…
jung-thomas Aug 22, 2026
dffb894
feat(camera): calibration profile reducers (envelope + clamped deriva…
jung-thomas Aug 22, 2026
921561c
fix(freshness): source markdown from ContentFiles.sourceContent via g…
jung-thomas Aug 22, 2026
c9a8f98
feat(camera): calibration capture loop + landmarker glue
jung-thomas Aug 22, 2026
cf6b04f
feat(freshness): persist reports with fingerprint disposition migration
jung-thomas Aug 22, 2026
c52de2d
fix(camera): release camera in finally if calibration landmarker load…
jung-thomas Aug 22, 2026
e96fc3f
feat(camera): calibration overlay component
jung-thomas Aug 22, 2026
a6fa76f
feat(camera): Calibrate control + calibration orchestration in main
jung-thomas Aug 22, 2026
f4349dc
feat(camera): debug overlay shows active thresholds + calibration flag
jung-thomas Aug 22, 2026
bae1f45
fix(camera): remove dead GAZE_BOTTOM_THRESHOLD import; fmt() hand thr…
jung-thomas Aug 22, 2026
974956a
docs(camera): calibration section in experimental-features
jung-thomas Aug 22, 2026
247b72e
fix(camera): abort calibration capture on cancel (no persist, no rest…
jung-thomas Aug 22, 2026
ae0a208
feat(freshness): checkFreshness + setDisposition service actions
jung-thomas Aug 22, 2026
af91b76
feat(freshness): worklist count + criticality read decorators
jung-thomas Aug 22, 2026
61bd711
feat(freshness): bulk scan + corpus-embedding jobs, FRESHNESS_SCAN_EN…
jung-thomas Aug 22, 2026
64debbf
Merge remote-tracking branch 'origin/DEV' into worktree-camera-calibr…
jung-thomas Aug 22, 2026
57c79de
feat(freshness): FE facet, findings table, worklist column, header ac…
jung-thomas Aug 22, 2026
0e01278
docs(freshness): gotcha entry + srv-qa cp audit note
jung-thomas Aug 22, 2026
55a501b
docs(freshness): expand gotcha with source-markdown and codeBlockInde…
jung-thomas Aug 22, 2026
42931d8
fix(freshness): non-destructive fail-open + numeric confidence/severi…
jung-thomas Aug 22, 2026
ec331f6
test: update scheduler registry job count for freshness jobs (46→48)
jung-thomas Aug 22, 2026
67b20ad
Merge pull request #1985 from sap-tutorials/worktree-camera-calibrati…
jung-thomas Aug 22, 2026
96e71f0
Merge pull request #1986 from sap-tutorials/worktree-freshness-detect…
jung-thomas Aug 22, 2026
68d2b90
a11y: ratchet baseline down after #1983 + #1984 deployed to DEV
jung-thomas Aug 23, 2026
a5cae77
a11y: resolve duplicate-main, browse banner, figcaption contrast, con…
jung-thomas Aug 23, 2026
6a9d353
Merge pull request #1988 from sap-tutorials/chore/a11y-rebaseline
jung-thomas Aug 23, 2026
8edccf2
Merge pull request #1989 from sap-tutorials/feat/a11y-landmarks
jung-thomas Aug 23, 2026
e1e5648
feat(prefs): add Super wide reading-width option (#1966)
jung-thomas Aug 23, 2026
2046d4a
fix(tutorial-prefs): hand gestures navigate tutorial steps, not Prev/…
jung-thomas Aug 23, 2026
c7a5d42
Merge pull request #1990 from sap-tutorials/feat/tutorial-super-wide-…
jung-thomas Aug 23, 2026
5fa23db
fix(tutorial-prefs): calibrated head-pitch eye scroll (up + down)
jung-thomas Aug 23, 2026
d17f53d
Merge pull request #1991 from sap-tutorials/fix/camera-input-hand-ste…
jung-thomas Aug 23, 2026
22c6df9
fix(prefs): guard size/width segmented-button emit on mount (#1980)
jung-thomas Aug 23, 2026
ef093d1
Merge pull request #1992 from sap-tutorials/fix/1980-prefs-size-width…
jung-thomas Aug 23, 2026
82af8ed
feat(selfie): add 13 advocate frames + thumbnails
jung-thomas Aug 23, 2026
364ab46
fix(selfie): track blank.png frame (no-advocate option)
jung-thomas Aug 23, 2026
f89bb80
Merge pull request #1993 from sap-tutorials/worktree-selfie-advocate-…
jung-thomas Aug 23, 2026
9f56539
a11y: fix tutorial duplicate-banner regression + lengthen scan settle
jung-thomas Aug 23, 2026
f130ee6
Merge pull request #1994 from sap-tutorials/feat/a11y-tutorial-banner
jung-thomas Aug 23, 2026
ec75907
a11y: neutralize animations in scan + ratchet baseline to 0 critical/…
jung-thomas Aug 23, 2026
3688555
Merge pull request #1995 from sap-tutorials/chore/a11y-rebaseline-final
jung-thomas Aug 23, 2026
e76a662
chore(release): bump MTA version to 1.18.2 for PROD release
jung-thomas Aug 23, 2026
2c548b0
Merge pull request #1996 from sap-tutorials/chore/release-1.18.2
jung-thomas Aug 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .deploy/mta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ ID: tutorials-ims
# Bump this on each release you deploy — it's the version shown by `cf mtas`
# and in the mtar filename (tutorials-ims_<version>.mtar). Deploy is manual:
# `cd .deploy && mbt build && cf deploy mta_archives/tutorials-ims_<version>.mtar -e ../deploy/<env>.mtaext -f`.
version: 1.18.1
version: 1.18.2

# Top-level parameters (overridable per-env via deploy/<env>.mtaext).
parameters:
Expand Down Expand Up @@ -171,7 +171,7 @@ modules:
- cp -r ../../hugo/assets ./hugo/assets
- cp -r ../../hugo/data ./hugo/data
- cp -r ../../hugo/i18n ./hugo/i18n
- bash -c "mkdir -p srv/jobs && mkdir -p srv/handlers && mkdir -p srv/lib/branch && mkdir -p srv/lib/runtime-config && mkdir -p srv/lib/prompts && mkdir -p srv/lib/kg && mkdir -p srv/mcp/prompts && cp ../../srv/lib/branch/condition.js ../../srv/lib/branch/engine.js ../../srv/lib/branch/ranker.js ../../srv/lib/branch/user-state.js ../../srv/lib/branch/loaders.js ../../srv/lib/branch/mission-detail.js ../../srv/lib/branch/slug-key.js ../../srv/lib/branch/decide.js ../../srv/lib/branch/joule-tool.js ../../srv/lib/branch/branch-telemetry.js ../../srv/lib/branch/group-by-alt.js ../../srv/lib/branch/profile-fields.js ../../srv/lib/branch/profile-override.js srv/lib/branch/ && cp ../../srv/lib/runtime-config/kg-settings.js ../../srv/lib/runtime-config/ui-events-settings.js ../../srv/lib/runtime-config/search-settings.js ../../srv/lib/runtime-config/navigator-settings.js ../../srv/lib/runtime-config/display-settings.js ../../srv/lib/runtime-config/tenant-settings.js ../../srv/lib/runtime-config/alert-settings.js srv/lib/runtime-config/ && cp ../../srv/lib/kg/on-demand-enqueue.js ../../srv/lib/kg/on-demand-cosine-rank.js srv/lib/kg/ && cp ../../srv/lib/credstore.js ../../srv/lib/secret-resolver.js ../../srv/lib/content-store.js ../../srv/lib/content-cache-coherence.js ../../srv/lib/edge-cache-headers.js ../../srv/lib/content-publish-session.js ../../srv/lib/resolve-tutorial-author.js ../../srv/lib/_tutorials-table.js ../../srv/lib/catalog-renderer.js ../../srv/lib/catalog-data.js ../../srv/lib/catalog-mission-hierarchy.js ../../srv/lib/chrome-shell.js ../../srv/lib/pipeline-log.js ../../srv/lib/legacy-id.js ../../srv/lib/embedding-pipeline.js ../../srv/lib/step-text-extractor.js ../../srv/lib/embedding-client.js ../../srv/lib/step-vectors.js ../../srv/lib/user-progress.js ../../srv/lib/co-completion.js ../../srv/lib/tutorial-centroid.js ../../srv/lib/tag-label-map.js ../../srv/lib/code-check-tool.js ../../srv/lib/code-check-prompt.js ../../srv/lib/code-check-handler.js ../../srv/lib/code-check-llm.js ../../srv/lib/code-check-step-loader.js ../../srv/lib/code-check-spec-publish.js ../../srv/lib/validate-answer-spec-publish.js ../../srv/lib/category-classifier.js ../../srv/lib/category-classifier-llm.js ../../srv/lib/category-seed-embeddings.js ../../srv/lib/build-catalog-categories.js ../../srv/lib/chat-settings-resolver.js ../../srv/lib/kg-extract.js ../../srv/lib/kg-queries.js ../../srv/lib/kg-projection.js ../../srv/lib/kg-similarity.js ../../srv/lib/kg-cycles.js ../../srv/lib/kg-graph-rebuild.js ../../srv/lib/kg-sparql-client.js ../../srv/lib/kg-merge-pair.js ../../srv/lib/kg-concept-loader.js ../../srv/lib/kg-neighborhood-cache.js ../../srv/lib/kg-neighborhood-merge.js ../../srv/lib/kg-neighborhood-full-helpers.js ../../srv/lib/kg-other-resources-loader.js ../../srv/lib/kg-stamp-meta-text.js ../../srv/lib/kg-tutorial-teaches-map.js ../../srv/lib/kg-resource-type-config.js ../../srv/lib/kg-meta-formatters.js ../../srv/lib/discovery-mission-categories.js ../../srv/lib/external-content-ttl.js ../../srv/lib/recompute-tutorial-progress-bulk-sql.js ../../srv/lib/youtube-fetcher.js ../../srv/lib/homepage-events-merger.js ../../srv/lib/homepage-rss-fetcher.js ../../srv/lib/rss-parse.js ../../srv/lib/community-blogs-fetcher.js ../../srv/lib/community-blog-source-defaults.js ../../srv/lib/community-blogs-classifier.js ../../srv/lib/safe-fetch.js ../../srv/lib/curl-transport.js ../../srv/lib/khoros-transport.js ../../srv/lib/explainer-generator.js ../../srv/lib/_token-cost.js ../../srv/lib/metrics.js ../../srv/lib/alerting.js ../../srv/lib/relevance-classifier.js ../../srv/lib/relevance-seed-embeddings.js ../../srv/lib/relevance-keyword-rules.js ../../srv/lib/canonicalize-link.js ../../srv/lib/detect-language-en.js ../../srv/lib/kg-community-coverage.js ../../srv/lib/page-key-map.js ../../srv/lib/page-fallback.js ../../srv/lib/task-record-submission-id.js ../../srv/lib/image-store.cjs ../../srv/lib/image-ingest.cjs ../../srv/lib/image-source-handler.js ../../srv/lib/img-cdn-fetch.cjs ../../srv/lib/img-cdn-retry.cjs ../../srv/lib/image-warm-utils.js ../../srv/lib/island-manifest.json srv/lib/ && cp ../../srv/handlers/categories-after-hooks.js ../../srv/handlers/completion-path-items-altgroup.js srv/handlers/ && mkdir -p srv && cp ../../srv/content-moderation-service.js srv/ && cp ../../srv/jobs/consolidate-concepts-job.js ../../srv/jobs/extract-concepts-job.js ../../srv/jobs/job-lock.js ../../srv/jobs/secret-expiry-check.js ../../srv/jobs/homepage-link-health.js ../../srv/jobs/kg-ondemand-job.js ../../srv/jobs/community-blogs-fetch-job.js ../../srv/jobs/community-blogs-classify-job.js ../../srv/jobs/fetch-news-job.js srv/jobs/ && cp ../../srv/lib/prompts/explainer-verb.md ../../srv/lib/prompts/explainer-shelf.md ../../srv/lib/prompts/explainer-shelf-entry.md ../../srv/lib/prompts/community-blogs-classifier.md srv/lib/prompts/ && cp ../../srv/mcp/prompts/summarize_mission_for_beginner.md ../../srv/mcp/prompts/generate_lab_exercise.md ../../srv/mcp/prompts/explain_concept.md ../../srv/mcp/prompts/suggest_learning_path.md srv/mcp/prompts/"
- bash -c "mkdir -p srv/jobs && mkdir -p srv/handlers && mkdir -p srv/lib/branch && mkdir -p srv/lib/runtime-config && mkdir -p srv/lib/prompts && mkdir -p srv/lib/kg && mkdir -p srv/mcp/prompts && cp ../../srv/lib/branch/condition.js ../../srv/lib/branch/engine.js ../../srv/lib/branch/ranker.js ../../srv/lib/branch/user-state.js ../../srv/lib/branch/loaders.js ../../srv/lib/branch/mission-detail.js ../../srv/lib/branch/slug-key.js ../../srv/lib/branch/decide.js ../../srv/lib/branch/joule-tool.js ../../srv/lib/branch/branch-telemetry.js ../../srv/lib/branch/group-by-alt.js ../../srv/lib/branch/profile-fields.js ../../srv/lib/branch/profile-override.js srv/lib/branch/ && cp ../../srv/lib/runtime-config/kg-settings.js ../../srv/lib/runtime-config/ui-events-settings.js ../../srv/lib/runtime-config/search-settings.js ../../srv/lib/runtime-config/navigator-settings.js ../../srv/lib/runtime-config/display-settings.js ../../srv/lib/runtime-config/tenant-settings.js ../../srv/lib/runtime-config/alert-settings.js srv/lib/runtime-config/ && cp ../../srv/lib/kg/on-demand-enqueue.js ../../srv/lib/kg/on-demand-cosine-rank.js srv/lib/kg/ && cp ../../srv/lib/credstore.js ../../srv/lib/secret-resolver.js ../../srv/lib/content-store.js ../../srv/lib/content-cache-coherence.js ../../srv/lib/edge-cache-headers.js ../../srv/lib/content-publish-session.js ../../srv/lib/resolve-tutorial-author.js ../../srv/lib/_tutorials-table.js ../../srv/lib/catalog-renderer.js ../../srv/lib/catalog-data.js ../../srv/lib/catalog-mission-hierarchy.js ../../srv/lib/chrome-shell.js ../../srv/lib/pipeline-log.js ../../srv/lib/legacy-id.js ../../srv/lib/embedding-pipeline.js ../../srv/lib/step-text-extractor.js ../../srv/lib/embedding-client.js ../../srv/lib/step-vectors.js ../../srv/lib/user-progress.js ../../srv/lib/co-completion.js ../../srv/lib/tutorial-centroid.js ../../srv/lib/tag-label-map.js ../../srv/lib/code-check-tool.js ../../srv/lib/code-check-prompt.js ../../srv/lib/code-check-handler.js ../../srv/lib/code-check-llm.js ../../srv/lib/code-check-step-loader.js ../../srv/lib/code-check-spec-publish.js ../../srv/lib/validate-answer-spec-publish.js ../../srv/lib/category-classifier.js ../../srv/lib/category-classifier-llm.js ../../srv/lib/category-seed-embeddings.js ../../srv/lib/build-catalog-categories.js ../../srv/lib/chat-settings-resolver.js ../../srv/lib/kg-extract.js ../../srv/lib/kg-queries.js ../../srv/lib/kg-projection.js ../../srv/lib/kg-similarity.js ../../srv/lib/kg-cycles.js ../../srv/lib/kg-graph-rebuild.js ../../srv/lib/kg-sparql-client.js ../../srv/lib/kg-merge-pair.js ../../srv/lib/kg-concept-loader.js ../../srv/lib/kg-neighborhood-cache.js ../../srv/lib/kg-neighborhood-merge.js ../../srv/lib/kg-neighborhood-full-helpers.js ../../srv/lib/kg-other-resources-loader.js ../../srv/lib/kg-stamp-meta-text.js ../../srv/lib/kg-tutorial-teaches-map.js ../../srv/lib/kg-resource-type-config.js ../../srv/lib/kg-meta-formatters.js ../../srv/lib/discovery-mission-categories.js ../../srv/lib/external-content-ttl.js ../../srv/lib/recompute-tutorial-progress-bulk-sql.js ../../srv/lib/youtube-fetcher.js ../../srv/lib/homepage-events-merger.js ../../srv/lib/homepage-rss-fetcher.js ../../srv/lib/rss-parse.js ../../srv/lib/community-blogs-fetcher.js ../../srv/lib/community-blog-source-defaults.js ../../srv/lib/community-blogs-classifier.js ../../srv/lib/safe-fetch.js ../../srv/lib/curl-transport.js ../../srv/lib/khoros-transport.js ../../srv/lib/explainer-generator.js ../../srv/lib/_token-cost.js ../../srv/lib/metrics.js ../../srv/lib/alerting.js ../../srv/lib/relevance-classifier.js ../../srv/lib/relevance-seed-embeddings.js ../../srv/lib/relevance-keyword-rules.js ../../srv/lib/canonicalize-link.js ../../srv/lib/detect-language-en.js ../../srv/lib/kg-community-coverage.js ../../srv/lib/page-key-map.js ../../srv/lib/page-fallback.js ../../srv/lib/task-record-submission-id.js ../../srv/lib/image-store.cjs ../../srv/lib/image-ingest.cjs ../../srv/lib/image-source-handler.js ../../srv/lib/img-cdn-fetch.cjs ../../srv/lib/img-cdn-retry.cjs ../../srv/lib/image-warm-utils.js ../../srv/lib/attachment-store.cjs ../../srv/lib/attachment-ingest.cjs ../../srv/lib/attachment-mime.cjs ../../srv/lib/attachment-warm-utils.js ../../srv/lib/attachment-source-handler.js ../../srv/lib/attachment-ingest-handler.js ../../srv/lib/island-manifest.json srv/lib/ && cp ../../srv/handlers/categories-after-hooks.js ../../srv/handlers/completion-path-items-altgroup.js srv/handlers/ && mkdir -p srv && cp ../../srv/content-moderation-service.js srv/ && cp ../../srv/jobs/consolidate-concepts-job.js ../../srv/jobs/extract-concepts-job.js ../../srv/jobs/job-lock.js ../../srv/jobs/secret-expiry-check.js ../../srv/jobs/homepage-link-health.js ../../srv/jobs/kg-ondemand-job.js ../../srv/jobs/community-blogs-fetch-job.js ../../srv/jobs/community-blogs-classify-job.js ../../srv/jobs/fetch-news-job.js srv/jobs/ && cp ../../srv/lib/prompts/explainer-verb.md ../../srv/lib/prompts/explainer-shelf.md ../../srv/lib/prompts/explainer-shelf-entry.md ../../srv/lib/prompts/community-blogs-classifier.md srv/lib/prompts/ && cp ../../srv/mcp/prompts/summarize_mission_for_beginner.md ../../srv/mcp/prompts/generate_lab_exercise.md ../../srv/mcp/prompts/explain_concept.md ../../srv/mcp/prompts/suggest_learning_path.md srv/mcp/prompts/"
- bash -c "node -e \"const p=require('./package.json'); p.dependencies=Object.assign(p.dependencies||{},{cheerio:'^1.2.0','@sap-ai-sdk/foundation-models':'^2.10.0'}); require('fs').writeFileSync('./package.json', JSON.stringify(p,null,2));\""
properties:
EXPOSE_CAP_UI: false
Expand Down
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,5 @@ Subsystem one-liners:
- **cds-caching CDS-DB store + metrics (issue #1179 → re-enabled #1182 → metrics disabled #1215 → metrics re-enabled #1222)** — the shared `caching` service (`cds.requires.caching`) uses `store: "cds"` in the `[hybrid]`/`[production]` profiles (base stays `store: "memory"` for local `cds watch` + unit tests). Gives multi-instance CF coherence (a `deleteByTag` bust on one instance invalidates all). **`metrics.enabled` is ON again (#1222)** — #1215 disabled it because on cds-caching ≤2.0.1 it threw `Wrong input for INT type` on every HANA flush (the plugin read back the hourly row via a flattened table-name SELECT → UPPERCASE column keys → `existingHourly.hits` is `undefined` → `undefined + n = NaN` → hdb INT-bind throw), so counters never accumulated (22 hourly rows stuck at 0). **cds-caching 2.0.2 fixes it** ([mikezaschka/cds-caching#27](https://github.com/mikezaschka/cds-caching/issues/27)): readback via the resolved CSN entity (`SELECT.one.from(Metrics)`) + `Number(existingHourly.<col>) || 0` coercion in `StatisticsPersistenceManager.js`. Re-enable is **config-only** (one-way): the plugin auto-persists `METRICSENABLED=1` on connect when config says `enabled:true` (`CachingService.js:133-135`) — no manual SQL to turn it on (the #1215 *disable* needed a `UPDATE ...SET METRICSENABLED=0` because nothing writes it back to 0). After deploy, clear the stale zeroed rows once per env: `DELETE FROM "PLUGIN_CDS_CACHING_METRICS" WHERE "cache"='caching'` (+ `KEYMETRICS`). Guards: `test/unit/caching-metrics-enabled.test.js` (renamed from `-disabled`) + `test/hybrid/caching-cds-store-boot.test.js` now assert metrics ON. **#1179 crash history:** the first srv deploy carrying `store: "cds"` crash-looped on CF (`Duplicate definition of artifact`) and was reverted (PR #1207); #1182 re-enables it with the resolve-guard fix below. **CF resolve-guard fix (#1182), two required halves:** (1) the srv nodejs `build.task` `model` list also includes `cds-caching/db/cache-store` + `cds-caching/db/statistics`, baking the four `plugin.cds_caching.*` entities into `srv/csn.json` (+4 defs, 0 views lost); (2) `srv/lib/strip-precompiled-plugin-roots.js` (called at top of `srv/server.js`, after `cds.plugins`, before model resolve) strips the plugin's runtime `env.roots` push when a precompiled `srv/csn.json` is present — otherwise those 2 extra roots tip CF's `resolve.many(env.roots)` past `length===1`, re-merging every `requires[].model` onto the precompiled csn → crash. Gated on `srv/csn.json` existence: strips in CF production, no-op in hybrid `cds watch` (compiles from source) and dev/unit (`store:memory` pushes nothing). Baking alone or stripping alone is insufficient — both are load-bearing. Reproducible locally from `gen/srv` (not the source tree — that always collapses to the single csn). **Metrics HDI gotcha:** this project's **explicit `build.tasks` list in `.cdsrc.json` suppresses cds's auto-registration of the plugin's build task** — so the four tables (`CacheStore` + `Caches`/`Metrics`/`KeyMetrics`) do NOT emit unless you add them by hand: `{ "for": "cds-caching" }` (emits `CacheStore.hdbtable`) + `{ "for": "hana", "src": "db", "dest": "db", "options": { "model": ["cds-caching/db/statistics"] } }` (the 3 metrics tables — model must be `statistics`-only; adding `db` to a `db`-dest task's model drops all ~247 service `.hdbview`s). QA container (`tutorials-hana-qa`) intentionally gets none — srv-qa doesn't wire caching. Metrics OData management API deliberately NOT registered (write actions). Test harness: unit workers get a stable memory-store config via `cds_requires_caching_*` env vars in `vitest.config.ts` (NOT a setupFiles that imports `@sap/cds` — that installs getter-only `SELECT`/`INSERT` globals and breaks tests assigning `globalThis.SELECT`) to close the fork-pool boot race (#1177). Full reference: [docs/developers/reference/cds-caching-store.md](docs/developers/reference/cds-caching-store.md).

- **User-facing UI changes want a committed e2e spec** — a per-PR unit test can't catch a cross-PR seam (that's how #1366's value-help widening shipped dead behind #1353's custom dialog; see #1371). Changing `app/admin/**`, `app/**/webapp/**`, `hugo/layouts/**`, or `hugo-apps/**` triggers an *advisory* PR nudge (`.github/workflows/e2e-coverage-nudge.yml`) to add/update a `test/e2e/` spec. It never blocks merge; the existing post-DEV-deploy `e2e` CI job is where coverage is actually exercised. Pattern: [docs/developers/reference/e2e-coverage-pattern.md](docs/developers/reference/e2e-coverage-pattern.md).

- **Freshness detector grounding needs the corpus-embedding backfill** — the `checkFreshness`/`freshness-scan` engine cosine-searches `ApiDocs`/`Samples` embeddings. Those columns are populated by `srv/jobs/freshness-corpus-embedding-job.js` (nightly `17 3` + on-demand `runJob`). Until it runs in an env, grounding returns nothing and every API-obsolescence claim degrades to `confidence: Low` (fail-open, by design). LLM calls use the SAP AI SDK directly (`@sap-ai-sdk/orchestration`, forced tool-call), NOT `@cap-js/ai`; unit tests inject `globalThis.__FRESHNESS_TEST_IMPL__`. Bulk scan gated by `FRESHNESS_SCAN_ENABLED` (default OFF). **Tutorial markdown is sourced from `ContentFiles.sourceContent` via `getTutorialSource(slug)` in `srv/lib/content-store.js` — NOT from `Steps.description`** (Steps are never populated with step markdown; reading Steps would yield nothing). Findings carry a **global `codeBlockIndex`** across the whole-tutorial markdown — per-step attribution is deferred because the persisted source is not split per step.
Loading
Loading