Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
67224d5
Merge pull request #2084 from sap-tutorials/chore/sync-main-into-dev-…
jung-thomas Aug 29, 2026
076a61b
docs: slim CLAUDE.md Top Gotchas to headline+link, relocate detail to…
jung-thomas Aug 31, 2026
ee0ab4f
Merge pull request #2086 from sap-tutorials/worktree-slim-claude-md
jung-thomas Aug 31, 2026
929547d
fix(docs): wrap bare <mission> in backticks so VitePress/Vue build pa…
jung-thomas Aug 31, 2026
815dfc1
Merge pull request #2087 from sap-tutorials/fix/docs-vitepress-angle-…
jung-thomas Aug 31, 2026
6780272
docs(admin): design spec for Tutorials OP enhancements (categories/co…
jung-thomas Aug 31, 2026
abfe446
docs(admin): record approved decisions (D1-D3) in OP enhancements spec
jung-thomas Aug 31, 2026
7f569ac
docs(admin): Phase 1 implementation plan (WS1-3 empty facets)
jung-thomas Aug 31, 2026
158f7e6
docs(admin): Phase 2 (media/freshness) + Phase 3 (KG) implementation …
jung-thomas Aug 31, 2026
5f74833
feat(publish): self-heal categories via classifyAndPersist after upse…
jung-thomas Aug 31, 2026
170965e
test(publish): hybrid guard for category population (#WS1)
jung-thomas Aug 31, 2026
67a5369
feat(db): add GitHub link columns to TutorialContributors (#WS2)
jung-thomas Aug 31, 2026
809a433
fix(db): emit HANA migration=3 for TutorialContributors GitHub column…
jung-thomas Aug 31, 2026
6c20476
feat(fetch): write contributors sidecar from git contributor list (#WS2)
jung-thomas Aug 31, 2026
27386a5
feat(publish): server REPLACE handler for TutorialContributors (#WS2)
jung-thomas Aug 31, 2026
48ffdce
feat(publish): non-fatal client step to publish contributors sidecars…
jung-thomas Aug 31, 2026
5e9192c
feat(admin-ui): GitHub-linked login column on Contributors table (#WS2)
jung-thomas Aug 31, 2026
7104490
test(publish): hybrid guard for contributor linking (#WS2)
jung-thomas Aug 31, 2026
2847256
feat(db): add TutorialValidationRules entity for all rules.vr rules (…
jung-thomas Aug 31, 2026
5e32029
feat(parser): collectAllRules for full rules.vr rule set (#WS3)
jung-thomas Aug 31, 2026
464296a
feat(fetch): write validation-rules sidecar (all rule types) (#WS3)
jung-thomas Aug 31, 2026
bbba5c3
feat(publish): server REPLACE handler for TutorialValidationRules (#WS3)
jung-thomas Aug 31, 2026
2018592
feat(publish): non-fatal client step to publish validation-rules side…
jung-thomas Aug 31, 2026
72b0a98
feat(admin-ui): All Validation Rules facet + relabel AI facet (#WS3)
jung-thomas Aug 31, 2026
6969b24
test(publish): hybrid guard for all-rules population (#WS3)
jung-thomas Aug 31, 2026
47f10e3
fix(db): align last-dev/csn.json with canonical cds build ordering
jung-thomas Aug 31, 2026
6a1e516
Merge pull request #2088 from sap-tutorials/worktree-admin-op-enhance…
jung-thomas Aug 31, 2026
645ab88
feat(db): add byteSize to TutorialImages/TutorialAssets (#WS5)
jung-thomas Aug 31, 2026
90a0d1f
feat(media): persist byteSize at image/asset ingest (#WS5)
jung-thomas Aug 31, 2026
9d3310b
feat(admin): read-only Media projections + Tutorials associations (#WS5)
jung-thomas Aug 31, 2026
99f5235
feat(admin-ui): Media facets (images/assets) with source link + byte …
jung-thomas Aug 31, 2026
3ec94a2
feat(admin-ui): Freshness Reports facet (runAt/model/cost/status) (#WS5)
jung-thomas Aug 31, 2026
b4d8897
test(media): hybrid guard for media exposure (#WS5)
jung-thomas Aug 31, 2026
87f2a42
Merge pull request #2089 from sap-tutorials/phase2-admin-op-media-fre…
jung-thomas Aug 31, 2026
b2807cf
feat(admin): read-only KG projections + Tutorials associations (#WS4)
jung-thomas Aug 31, 2026
4957afc
feat(admin): expose community membership/label on Tutorials (#WS4)
jung-thomas Aug 31, 2026
fb994af
feat(admin-ui): Knowledge Graph facet (concepts/PageRank/community/co…
jung-thomas Aug 31, 2026
81fbf94
fix(admin-ui): add KgCommunityFacet to Tutorials OP (communityMembers…
jung-thomas Aug 31, 2026
ee93c1a
test(kg): hybrid guard for KG facet reads (#WS4)
jung-thomas Aug 31, 2026
cb058ae
Merge pull request #2090 from sap-tutorials/phase3-admin-op-kg-facet
jung-thomas Aug 31, 2026
2532ae8
fix(ci): allowlist srv-only publish-contributors + publish-validation…
jung-thomas Aug 31, 2026
c9eeb27
fix(srv-qa): lazy-import category-classifier-llm to unbreak srv-qa boot
jung-thomas Aug 31, 2026
efdf968
Merge pull request #2091 from sap-tutorials/fix/srv-qa-route-drift-ws…
jung-thomas Aug 31, 2026
6542f96
Merge pull request #2092 from sap-tutorials/fix/srv-qa-classifier-laz…
jung-thomas Aug 31, 2026
f3077cc
fix(publish): gate category self-heal to avoid OOM on bulk publishes
jung-thomas Sep 1, 2026
5a420b1
Merge pull request #2093 from sap-tutorials/fix/category-selfheal-bul…
jung-thomas Sep 1, 2026
d310d32
fix(categories): resolve namespaced entities so backfill works on HAN…
jung-thomas Sep 1, 2026
b131911
fix(categories): pass resolved embedding model to embed() in seed-emb…
jung-thomas Sep 1, 2026
3b811e1
feat(admin-ui): make Tutorials OP facets readable (concepts/community…
jung-thomas Sep 1, 2026
e0053ee
Merge pull request #2095 from sap-tutorials/fix/backfill-categories-hana
jung-thomas Sep 1, 2026
e2d3e63
Merge pull request #2096 from sap-tutorials/feat/admin-facet-readability
jung-thomas Sep 1, 2026
c1e519f
docs(topics): tag-tree topics design spec
jung-thomas Sep 1, 2026
2317c9b
docs(topics): tag-tree topics implementation plan
jung-thomas Sep 1, 2026
6d00be7
feat(topics): pure slug flatten + collision-qualify + legacy-normalize
jung-thomas Sep 1, 2026
5404a9b
feat(topics): tree + detail data assemblers (tag-sourced, concept-enr…
jung-thomas Sep 1, 2026
c8e4a85
fix(#2097): scope QA notify workflow to default branch
jung-thomas Sep 1, 2026
5ea0f0b
refactor(topics): eliminate double loadLiveTags; remove unused parseT…
jung-thomas Sep 1, 2026
506744c
feat(topics): /build/topics-tree + /build/topics/:slug JSON feed hand…
jung-thomas Sep 1, 2026
acab735
fix(topics): add error handling to build handlers, match build-concep…
jung-thomas Sep 1, 2026
078545a
feat(topics): CAP-rendered tree index (topic-list-page) + chrome-shel…
jung-thomas Sep 1, 2026
52139ba
feat(topics): topic detail body renderer
jung-thomas Sep 1, 2026
92b5b4e
fix(topics): esc() single-quote + explicit utf-8 hash encoding for co…
jung-thomas Sep 1, 2026
831d456
feat(topics): per-slug HANA blob publisher (renderTopicsIntoSession)
jung-thomas Sep 1, 2026
4c506c6
feat(topics): register topic-blob publish step in content publish path
jung-thomas Sep 1, 2026
b2d2a80
feat(topics): register /build/topics-tree, /build/topics/:slug, /cont…
jung-thomas Sep 1, 2026
f4363ca
Merge pull request #2098 from sap-tutorials/fix/2097-notify-qa-branch…
jung-thomas Sep 1, 2026
098ff31
fix(topics): mirror concepts redirect block in /content/topics/:slug …
jung-thomas Sep 1, 2026
025a45d
feat(topics): approuter dynamic /topics routes + /search 301 to navig…
jung-thomas Sep 1, 2026
bd8c735
feat(topics): topics-tree progressive-enhancement island (filter + de…
jung-thomas Sep 1, 2026
6acd846
chore(topics): retire legacy topics_gallery section (homepage band un…
jung-thomas Sep 1, 2026
ddcb234
test(topics): e2e + hybrid + smoke coverage for tag-tree topics
jung-thomas Sep 1, 2026
3538415
test(topics): fix smoke 404→no-200 invariant + harden e2e leaf-nav & …
jung-thomas Sep 1, 2026
d4c393b
refactor(topics): hoist publish-loop corpus loads; retire orphaned is…
jung-thomas Sep 1, 2026
5cddea6
Merge pull request #2099 from sap-tutorials/worktree-tag-tree-topics
jung-thomas Sep 1, 2026
f1000f5
fix(approuter): move /search 301 to middleware; drop invalid xs-app.j…
jung-thomas Sep 2, 2026
10167af
Merge pull request #2100 from sap-tutorials/fix/approuter-search-redi…
jung-thomas Sep 2, 2026
2a2f1ca
fix(topics): URL-safe topic slugs so /topics/<slug> serves (#2099 fol…
jung-thomas Sep 2, 2026
46da520
Merge pull request #2106 from sap-tutorials/fix/topic-slug-urlsafe
jung-thomas Sep 2, 2026
7b9f28d
feat(devtoberfest): schedule-consistency check across planner + exter…
jung-thomas Sep 2, 2026
466f446
Merge pull request #2107 from sap-tutorials/worktree-devtoberfest-sch…
jung-thomas Sep 2, 2026
6746082
feat(cross-container): ADVOCATE_VALUE_HELP_V1 view + role grants (#2102)
jung-thomas Sep 2, 2026
08ca1bd
fix(ci): allowlist /content/topics* as srv-only in route-drift guard
jung-thomas Sep 2, 2026
cff2d31
Merge pull request #2108 from sap-tutorials/fix/srv-qa-topics-route-a…
jung-thomas Sep 2, 2026
c859d1d
Merge pull request #2109 from sap-tutorials/feat/advocate-value-help
jung-thomas Sep 2, 2026
4705668
fix(admin): only gate published change on actual value change (#2111)
jung-thomas Sep 2, 2026
0f6ba34
Merge pull request #2114 from sap-tutorials/fix/2111-author-published…
jung-thomas Sep 2, 2026
0bbaf17
fix(tutorial): make Overview tags clickable (#2112)
jung-thomas Sep 2, 2026
c2577b4
feat(devtoberfest): Live vs Prerecorded session tag + format filter (…
jung-thomas Sep 2, 2026
620d3c8
Merge pull request #2115 from sap-tutorials/fix/2112-clickable-overvi…
jung-thomas Sep 2, 2026
f53067a
Merge pull request #2116 from sap-tutorials/worktree-devtoberfest-liv…
jung-thomas Sep 2, 2026
47d3b93
fix(topics): parse real titlePath separators so /topics/ tree nests
jung-thomas Sep 2, 2026
24abea4
Merge pull request #2117 from sap-tutorials/deploy-dev-46da5201
jung-thomas Sep 2, 2026
28866d3
chore(release): bump MTA 1.20.1 → 1.21.0 + refresh What's New digest
jung-thomas Sep 3, 2026
454b5a6
Merge pull request #2118 from sap-tutorials/chore/release-1.21.0
jung-thomas Sep 3, 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.20.1
version: 1.21.0

# Top-level parameters (overridable per-env via deploy/<env>.mtaext).
parameters:
Expand Down Expand Up @@ -172,7 +172,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-delta-flags.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/ && mkdir -p srv/lib/feature-flags && cp ../../srv/lib/feature-flags/db-flags.js ../../srv/lib/feature-flags/registry.js srv/lib/feature-flags/ && 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-delta-flags.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/contributors-publish.js ../../srv/lib/validation-rules-publish.js ../../srv/lib/island-manifest.json srv/lib/ && mkdir -p srv/lib/feature-flags && cp ../../srv/lib/feature-flags/db-flags.js ../../srv/lib/feature-flags/registry.js srv/lib/feature-flags/ && 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
19 changes: 18 additions & 1 deletion .github/workflows/notify-qa.yml.template
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@
name: Notify tutorials-qa
on:
push:
# -Contribution repos are a MIXTURE of default branches: most default to
# `main`, but Tutorials-Contribution still defaults to `master`. List BOTH
# so this fires ONLY on the repo's default branch — and NEVER on feature
# branches. Without this filter a push to any branch (e.g. the devtoberfest
# validation-tutorial bot's `validation-tutorial/*` branches) dispatches a
# QA rebuild for a slug that exists only on that branch; QA discovery reads
# the default branch, so the slug is a phantom and the rebuild hard-fails
# "unknown slug in filter" (tutorials-ims#2097). Mirrors the branch filter
# in docs/authors/tutorial-repo-dispatch.yml (the PROD notify template).
branches: [master, main]
paths:
- 'tutorials/**'

Expand All @@ -17,8 +27,15 @@ jobs:
changed=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} \
| awk -F/ '/^tutorials\//{print $2}' | sort -u)
count=$(echo "$changed" | wc -l)
# Only emit a slug when EXACTLY one tutorial changed AND it matches the
# strict slug charset (whole-value POSIX case match); anything else →
# empty slug → rebuild-content-qa.yml runs a full rebuild. Mirrors
# docs/authors/tutorial-repo-dispatch.yml.
if [ "$count" = "1" ] && [ -n "$changed" ]; then
echo "slug=$changed" >> "$GITHUB_OUTPUT"
case "$changed" in
*[!a-z0-9-]* | -* ) echo "slug=" >> "$GITHUB_OUTPUT" ;;
*) echo "slug=$changed" >> "$GITHUB_OUTPUT" ;;
esac
else
echo "slug=" >> "$GITHUB_OUTPUT"
fi
Expand Down
Loading
Loading