From 01bdcbd013afb18c48241c853566716d7ae9e4d1 Mon Sep 17 00:00:00 2001 From: Cedric Vidal Date: Wed, 23 Sep 2026 13:11:12 -0700 Subject: [PATCH 1/6] website: add Articles & talks community page and landing teaser Articles and talks are Astro content collections (one YAML per entry, schema-validated at build) rendered on a new Community page and a 'From the community' landing section. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- website/AGENTS.md | 41 ++++++- website/README.md | 21 +++- website/astro.config.mjs | 4 + .../components/community/ArticleList.astro | 67 +++++++++++ .../community/CommunityTeaser.astro | 37 ++++++ .../src/components/community/TalkCard.astro | 106 ++++++++++++++++++ .../src/components/community/TalkList.astro | 22 ++++ website/src/components/community/community.ts | 51 +++++++++ website/src/content.config.ts | 38 +++++++ .../articles/behind-spfx-dev-skills.yaml | 4 + .../building-ax-evals-that-actually-work.yaml | 4 + .../dont-rewrite-your-cli-for-agents.yaml | 4 + ...conflicts-between-ai-agent-extensions.yaml | 4 + ...erience-changes-without-shipping-them.yaml | 4 + ...gent-skills-without-hitting-real-apis.yaml | 4 + ...nt-have-preferences-they-have-context.yaml | 4 + .../not-all-model-upgrades-are-upgrades.yaml | 4 + .../stop-overloading-your-skills.yaml | 4 + ...e-hidden-variables-in-your-agent-eval.yaml | 4 + ...hat-ai-benchmarks-are-not-telling-you.yaml | 4 + ...en-the-model-has-never-seen-your-code.yaml | 4 + ...s-keep-using-deprecated-clis-and-sdks.yaml | 4 + ...ork-might-not-need-the-smartest-model.yaml | 4 + .../docs/community/articles-and-talks.mdx | 18 +++ website/src/content/docs/index.mdx | 4 + .../2026-09-14-mcp-community-connect-sf.yaml | 7 ++ .../talks/2026-09-21-global-ai-new-york.yaml | 7 ++ website/src/styles/landing.css | 50 +++++++++ 28 files changed, 522 insertions(+), 7 deletions(-) create mode 100644 website/src/components/community/ArticleList.astro create mode 100644 website/src/components/community/CommunityTeaser.astro create mode 100644 website/src/components/community/TalkCard.astro create mode 100644 website/src/components/community/TalkList.astro create mode 100644 website/src/components/community/community.ts create mode 100644 website/src/content/articles/behind-spfx-dev-skills.yaml create mode 100644 website/src/content/articles/building-ax-evals-that-actually-work.yaml create mode 100644 website/src/content/articles/dont-rewrite-your-cli-for-agents.yaml create mode 100644 website/src/content/articles/how-to-diagnose-conflicts-between-ai-agent-extensions.yaml create mode 100644 website/src/content/articles/how-to-test-agent-experience-changes-without-shipping-them.yaml create mode 100644 website/src/content/articles/how-to-test-agent-skills-without-hitting-real-apis.yaml create mode 100644 website/src/content/articles/models-dont-have-preferences-they-have-context.yaml create mode 100644 website/src/content/articles/not-all-model-upgrades-are-upgrades.yaml create mode 100644 website/src/content/articles/stop-overloading-your-skills.yaml create mode 100644 website/src/content/articles/the-hidden-variables-in-your-agent-eval.yaml create mode 100644 website/src/content/articles/what-ai-benchmarks-are-not-telling-you.yaml create mode 100644 website/src/content/articles/when-the-model-has-never-seen-your-code.yaml create mode 100644 website/src/content/articles/why-ai-coding-agents-keep-using-deprecated-clis-and-sdks.yaml create mode 100644 website/src/content/articles/your-work-might-not-need-the-smartest-model.yaml create mode 100644 website/src/content/docs/community/articles-and-talks.mdx create mode 100644 website/src/content/talks/2026-09-14-mcp-community-connect-sf.yaml create mode 100644 website/src/content/talks/2026-09-21-global-ai-new-york.yaml diff --git a/website/AGENTS.md b/website/AGENTS.md index 9d6e68c0b..7e5923bd6 100644 --- a/website/AGENTS.md +++ b/website/AGENTS.md @@ -24,7 +24,15 @@ A static documentation site published to GitHub Pages. ## Where things live - `src/content/docs/` — all user-facing pages (`.md` and `.mdx`) - - `introduction/`, `getting-started/`, `guides/`, `reference/`, `resources/` + - `introduction/`, `getting-started/`, `guides/`, `reference/`, + `resources/`, `community/` +- `src/content/articles/`, `src/content/talks/` — one YAML file per + published article / talk, schema-validated by the `articles` and + `talks` collections in `src/content.config.ts` (see + "Articles & talks" below) +- `src/components/community/` — `ArticleList`, `TalkList`, + `TalkCard`, and `CommunityTeaser` (the landing-page section), all + reading those collections - Sidebar order is defined in `astro.config.mjs`, not by directory order - `src/openapi/scope-openapi.json` — committed artifact generated from the Scope API's OpenAPI registry; drives the auto-generated REST @@ -152,6 +160,37 @@ Sidebar order is set in `astro.config.mjs`. Adding a new page requires updating the sidebar array. The auto-generated REST API groups are spread via `...openAPISidebarGroups`. +### Articles & talks + +The `community/articles-and-talks` page and the "From the community" +section on the landing page are generated from two content +collections. To add an entry, add one YAML file. No code changes are +needed. + +- **Article**: `src/content/articles/.yaml` + ```yaml + title: Building AX evals that actually work + url: https://developer.microsoft.com/blog/building-ax-evals-that-actually-work/ + publication: Microsoft for Developers # blog name + date: 2026-07-15 # publish date (optional) + ``` +- **Talk**: `src/content/talks/-.yaml` + ```yaml + title: "From Findings to Fixes: ..." + speakers: [Jay Gordon, Cedric Vidal] + event: Global AI New York + venue: Microsoft Lafayette, New York City + date: 2026-09-21 + eventUrl: https://globalai.community/e/783bfa20 # GAIC event page + youtubeId: SxaKOmqX-rk # omit while pending + ``` + +Take title, blog name, and publish date from the article page itself. +If a date can't be confirmed, leave `date` out; undated articles +sort last. A talk without `youtubeId` shows "Video coming soon". +Both lists sort newest first. A missing field, bad URL, or bad date +fails `pnpm run build`. + ### Style - Hard-wrap prose at ~70–80 columns for readable diffs. diff --git a/website/README.md b/website/README.md index a54ad0414..d5f4e5824 100644 --- a/website/README.md +++ b/website/README.md @@ -16,12 +16,17 @@ The product and this documentation site live in ├── public/ # static assets ├── src/ │ ├── assets/ -│ ├── content/docs/ # all user-facing pages (.md / .mdx) -│ │ ├── introduction/ -│ │ ├── getting-started/ -│ │ ├── guides/ -│ │ ├── reference/ -│ │ └── resources/ +│ ├── components/community/ # article/talk lists + landing teaser +│ ├── content/ +│ │ ├── docs/ # all user-facing pages (.md / .mdx) +│ │ │ ├── introduction/ +│ │ │ ├── getting-started/ +│ │ │ ├── guides/ +│ │ │ ├── reference/ +│ │ │ ├── resources/ +│ │ │ └── community/ +│ │ ├── articles/ # one YAML per published article +│ │ └── talks/ # one YAML per talk │ ├── openapi/scope-openapi.json # artifact generated from the API registry │ ├── plugins/ │ │ ├── remark-base-path.mjs # applies the deployment base to internal links @@ -72,6 +77,10 @@ Sidebar order is defined in `astro.config.mjs`, not by directory order. `scope-core` checkout, so root workspace dependencies must be installed first. +- To list a new article or talk on the Community page, add one YAML + file under `src/content/articles/` or `src/content/talks/`. See + "Articles & talks" in [AGENTS.md](AGENTS.md) for the fields. + See [AGENTS.md](AGENTS.md) for conventions, the source-of-truth policy (everything factual must be grounded in scope-core), and where to look in scope-core for any given topic. diff --git a/website/astro.config.mjs b/website/astro.config.mjs index e6d7d4179..30d1fd7e4 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -133,6 +133,10 @@ export default defineConfig({ { label: 'Glossary', slug: 'resources/glossary' }, ], }, + { + label: 'Community', + items: [{ label: 'Articles & talks', slug: 'community/articles-and-talks' }], + }, ], }), ], diff --git a/website/src/components/community/ArticleList.astro b/website/src/components/community/ArticleList.astro new file mode 100644 index 000000000..8fc288f47 --- /dev/null +++ b/website/src/components/community/ArticleList.astro @@ -0,0 +1,67 @@ +--- +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { formatDate, getArticles, isoDate } from './community'; + +interface Props { + /** Show only the N most recent articles. */ + limit?: number; +} + +const { limit } = Astro.props; +const all = await getArticles(); +const articles = limit === undefined ? all : all.slice(0, limit); +--- + +
    + { + articles.map(({ data }) => ( +
  • + + {data.title} + + +
  • + )) + } +
+ + diff --git a/website/src/components/community/CommunityTeaser.astro b/website/src/components/community/CommunityTeaser.astro new file mode 100644 index 000000000..322c8bbad --- /dev/null +++ b/website/src/components/community/CommunityTeaser.astro @@ -0,0 +1,37 @@ +--- +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import ArticleList from './ArticleList.astro'; +import TalkCard from './TalkCard.astro'; +import { getTalks } from './community'; + +const talks = await getTalks(); +const featured = talks.find((t) => t.data.youtubeId) ?? talks[0]; +const allHref = `${import.meta.env.BASE_URL.replace(/\/$/, '')}/community/articles-and-talks/`; +--- + +
+
+ From the community +

Articles & talks

+

What we've learned evaluating agentic product experiences with Scope, from the blog and the stage.

+
+ +
+
+

Latest articles

+ +
+ { + featured && ( +
+

Featured talk

+ +
+ ) + } +
+ + See all articles & talks → +
diff --git a/website/src/components/community/TalkCard.astro b/website/src/components/community/TalkCard.astro new file mode 100644 index 000000000..1c2c5fdb3 --- /dev/null +++ b/website/src/components/community/TalkCard.astro @@ -0,0 +1,106 @@ +--- +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { formatDate, formatSpeakers, isoDate, type Talk } from './community'; + +interface Props { + talk: Talk; +} + +const { data } = Astro.props.talk; +--- + +
+
+ { + data.youtubeId ? ( +