From f5d8a13a4fea672444d3a1967c08b0199a5be374 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Mon, 28 Sep 2026 11:54:04 +1000 Subject: [PATCH 1/6] news/activity: split updates into News and an Activity feed News is now for announcements people write (new projects, grants, people, workshops). Library releases and lecture updates move to a new Activity page, built from _data/activity/*.yml, which the reporter bot will write to instead of _posts/. - README: define the two streams and the Activity data schema - /activity/: new page and layout, grouped by month, with badges for release, lectures and translation entries - Migrate the reporter's 11 merged posts and 14 open drafts into _data/activity/, dropping excluded items (dependency/CI bumps, analytics, editor metadata, website changes), correcting summaries and dating each entry by when it went live - Add five library releases the reporter never reported - Check the Activity data files in CI - Redirect the removed posts' URLs to /activity/, and keep redirect stubs out of sitemap.xml - Link Activity from the Projects menu, the footer and /news/ Co-Authored-By: Claude Opus 5.5 --- .github/copilot-instructions.md | 11 +-- .github/scripts/check-activity-data.rb | 78 ++++++++++++++++++++ .github/workflows/build.yml | 3 + README.md | 57 +++++++++++++++ _data/activity/2026-06-14-lectures.yml | 11 +++ _data/activity/2026-06-21-lectures.yml | 15 ++++ _data/activity/2026-06-28-lectures.yml | 11 +++ _data/activity/2026-07-05-lectures.yml | 13 ++++ _data/activity/2026-07-06-software.yml | 8 +++ _data/activity/2026-07-08-software.yml | 8 +++ _data/activity/2026-07-12-lectures.yml | 19 +++++ _data/activity/2026-07-13-software.yml | 8 +++ _data/activity/2026-07-15-software.yml | 28 ++++++++ _data/activity/2026-07-20-software.yml | 8 +++ _data/activity/2026-07-26-lectures.yml | 13 ++++ _data/activity/2026-07-26-software.yml | 8 +++ _data/activity/2026-08-02-lectures.yml | 11 +++ _data/activity/2026-08-02-software.yml | 23 ++++++ _data/activity/2026-08-09-lectures.yml | 43 +++++++++++ _data/activity/2026-08-12-software.yml | 8 +++ _data/activity/2026-08-23-lectures.yml | 21 ++++++ _data/activity/2026-09-14-software.yml | 8 +++ _data/activity/2026-09-16-software.yml | 8 +++ _data/activity/2026-09-23-software.yml | 8 +++ _data/activity/2026-09-24-software.yml | 8 +++ _data/activity/2026-09-27-lectures.yml | 15 ++++ _data/activity/2026-09-28-software.yml | 28 ++++++++ _layouts/activity.html | 56 +++++++++++++++ _layouts/default.html | 4 +- _posts/2026-06-14-lectures.md | 10 --- _posts/2026-06-14-website.md | 11 --- _posts/2026-06-21-lectures.md | 12 ---- _posts/2026-06-21-website.md | 10 --- _posts/2026-06-28-lectures.md | 10 --- _posts/2026-07-05-lectures.md | 11 --- _posts/2026-07-06-software.md | 9 --- _posts/2026-07-08-software.md | 9 --- _posts/2026-07-12-lectures.md | 16 ----- _posts/2026-07-13-software.md | 9 --- _posts/2026-07-15-software.md | 14 ---- assets/main.scss | 98 ++++++++++++++++++++++++-- pages/activity.md | 25 +++++++ pages/archives.md | 2 + sitemap.xml | 2 + 44 files changed, 658 insertions(+), 130 deletions(-) create mode 100644 .github/scripts/check-activity-data.rb create mode 100644 _data/activity/2026-06-14-lectures.yml create mode 100644 _data/activity/2026-06-21-lectures.yml create mode 100644 _data/activity/2026-06-28-lectures.yml create mode 100644 _data/activity/2026-07-05-lectures.yml create mode 100644 _data/activity/2026-07-06-software.yml create mode 100644 _data/activity/2026-07-08-software.yml create mode 100644 _data/activity/2026-07-12-lectures.yml create mode 100644 _data/activity/2026-07-13-software.yml create mode 100644 _data/activity/2026-07-15-software.yml create mode 100644 _data/activity/2026-07-20-software.yml create mode 100644 _data/activity/2026-07-26-lectures.yml create mode 100644 _data/activity/2026-07-26-software.yml create mode 100644 _data/activity/2026-08-02-lectures.yml create mode 100644 _data/activity/2026-08-02-software.yml create mode 100644 _data/activity/2026-08-09-lectures.yml create mode 100644 _data/activity/2026-08-12-software.yml create mode 100644 _data/activity/2026-08-23-lectures.yml create mode 100644 _data/activity/2026-09-14-software.yml create mode 100644 _data/activity/2026-09-16-software.yml create mode 100644 _data/activity/2026-09-23-software.yml create mode 100644 _data/activity/2026-09-24-software.yml create mode 100644 _data/activity/2026-09-27-lectures.yml create mode 100644 _data/activity/2026-09-28-software.yml create mode 100644 _layouts/activity.html delete mode 100644 _posts/2026-06-14-lectures.md delete mode 100644 _posts/2026-06-14-website.md delete mode 100644 _posts/2026-06-21-lectures.md delete mode 100644 _posts/2026-06-21-website.md delete mode 100644 _posts/2026-06-28-lectures.md delete mode 100644 _posts/2026-07-05-lectures.md delete mode 100644 _posts/2026-07-06-software.md delete mode 100644 _posts/2026-07-08-software.md delete mode 100644 _posts/2026-07-12-lectures.md delete mode 100644 _posts/2026-07-13-software.md delete mode 100644 _posts/2026-07-15-software.md create mode 100644 pages/activity.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index dc2d566b..bd9fa878 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -33,7 +33,8 @@ Key directories and files: - `Gemfile` - Ruby dependencies specification - `_layouts/` - Jekyll layout templates (home.html, default.html, post.html, etc.) - `_includes/` - Jekyll include templates (quantecon-menubar.html) -- `_posts/` - Blog posts and news articles (sorted chronologically) +- `_posts/` - News posts, written by people (sorted chronologically) +- `_data/activity/` - Activity feed data (library releases, lecture updates), written by the reporter bot — see "News and Activity" in README.md - `_lectures/` - Collection of lecture series pages - `_projects/` - Collection of project pages - `_team-members/` - Collection of team member profiles @@ -48,7 +49,7 @@ Key directories and files: ### Common Operations **Adding new content:** -- Blog posts: Add markdown files to `_posts/` with format `YYYY-MM-DD-title.md` +- News posts: Add markdown files to `_posts/` with format `YYYY-MM-DD-title.md` — only for announcements (new projects, grants, people, workshops); releases and lecture updates belong in Activity (see "News and Activity" in README.md) - Team members: Add markdown files to `_team-members/` - Lectures: Add markdown files to `_lectures/` - Workshops: Add to `pages/workshops.md` **and** update the hardcoded "Recent Workshops" list in `_layouts/home.html` (see #197 for planned automation) @@ -69,13 +70,14 @@ Key directories and files: 4. Navigate through the main sections: - Home page - verify layout and content load - Lectures page - verify lecture series are listed - - News page - verify blog posts display + - News page - verify news posts display + - Activity page - verify entries from `_data/activity/` display, grouped by month - About page - verify team information - Navigation menu - verify all links work 5. Test responsive design by resizing browser window 6. Verify images and styling load correctly -**No formal testing infrastructure exists** - validation is done through manual browser testing. +**No formal testing infrastructure exists** - validation is done through manual browser testing. The one automated check is `ruby .github/scripts/check-activity-data.rb`, which CI runs to validate the Activity data files. **No linting or formatting commands** - the repository has minimal tooling beyond Jekyll itself. @@ -154,6 +156,7 @@ bundle exec jekyll build ├── Gemfile ├── README.md ├── _config.yml +├── _data/activity/ ├── _includes/ ├── _layouts/ ├── _lectures/ diff --git a/.github/scripts/check-activity-data.rb b/.github/scripts/check-activity-data.rb new file mode 100644 index 00000000..83d4f75f --- /dev/null +++ b/.github/scripts/check-activity-data.rb @@ -0,0 +1,78 @@ +# Check the Activity feed data in _data/activity/*.yml against the schema in +# README.md ("News and Activity"). The reporter bot writes these files, so a bad +# file should fail its PR with a message that names the file, rather than break +# the Jekyll build or render silently. +require "date" +require "yaml" + +DATA_DIR = File.expand_path("../../_data/activity", __dir__) +TYPES = %w[release lectures translation].freeze +REQUIRED = %w[date type project url].freeze + +def blank?(value) + value.nil? || value.to_s.strip.empty? +end + +paths = Dir.glob(File.join(DATA_DIR, "*.{yml,yaml}")).sort +if paths.empty? + puts "::error::No Activity data files found in #{DATA_DIR}" + exit 1 +end + +errors = [] +paths.each do |full_path| + path = full_path.delete_prefix("#{File.expand_path('../..', __dir__)}/") + begin + entries = YAML.safe_load(File.read(full_path), permitted_classes: [Date]) + rescue Psych::Exception => e + errors << "#{path}: invalid YAML (#{e.message})" + next + end + unless entries.is_a?(Array) && !entries.empty? + errors << "#{path}: must be a non-empty list of entries" + next + end + + entries.each_with_index do |entry, i| + where = "#{path}, entry #{i + 1}" + unless entry.is_a?(Hash) + errors << "#{where}: must be a mapping" + next + end + missing = REQUIRED.select { |key| blank?(entry[key]) } + errors << "#{where}: missing #{missing.join(', ')}" unless missing.empty? + errors << "#{where}: date must be an unquoted YYYY-MM-DD date" if entry["date"] && !entry["date"].is_a?(Date) + errors << "#{where}: type must be one of #{TYPES.join(', ')}" if entry["type"] && !TYPES.include?(entry["type"]) + errors << "#{where}: url must start with https://" unless blank?(entry["url"]) || entry["url"].to_s.start_with?("https://") + if entry["type"] == "release" && !(entry["version"].is_a?(String) && !blank?(entry["version"])) + errors << "#{where}: release entries need a version, written as a string (quote numeric-looking versions)" + end + if entry.key?("summary") + summary = entry["summary"] + if !summary.is_a?(String) || blank?(summary) + errors << "#{where}: summary must be a non-empty string (omit the key instead)" + elsif summary.count("`").odd? || summary.include?("``") + errors << "#{where}: summary has an unmatched or doubled backtick" + end + end + + changes = entry["changes"] || [] + unless changes.is_a?(Array) + errors << "#{where}: changes must be a list" + next + end + errors << "#{where}: changes must not be an empty list (omit the key instead)" if entry.key?("changes") && changes.empty? + changes.each_with_index do |change, j| + next if change.is_a?(Hash) && change["title"].is_a?(String) && !blank?(change["title"]) && + change["url"].to_s.start_with?("https://") + errors << "#{where}, change #{j + 1}: needs a string title and an https:// url" + end + end +end + +if errors.empty? + puts "Activity data OK (#{paths.size} files)" +else + errors.each { |error| puts "::error::#{error}" } + exit 1 +end diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ce075cd6..91a579bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,9 @@ jobs: ruby-version: '3.4' bundler-cache: true + - name: Check Activity data + run: ruby .github/scripts/check-activity-data.rb + - name: Build Jekyll site run: bundle exec jekyll build env: diff --git a/README.md b/README.md index 9cf73799..b5ce4e22 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,63 @@ Website for QuantEcon Organisation bundle exec jekyll serve ``` +## News and Activity + +The site has two streams of updates. The rule of thumb: **people write News, the reporter bot writes Activity.** The bot never publishes to News. + +| | News ([/news/](https://quantecon.org/news/)) | Activity ([/activity/](https://quantecon.org/activity/)) | +|---|---|---| +| **What goes in** | New projects (a new lecture series, book, a library's first public release, or a new language edition of a lecture series), grants and funding, people (RAs, team changes, open positions), workshops, tutorials and talks, partnerships, and changes that affect users | Every library release; changes to existing lecture series (new lectures, new sections and exercises, substantive revisions, fixes a reader would notice); updates to translated editions | +| **Written by** | A person | The reporter bot (maintained in the private `QuantEcon/reports-activity` repository) | +| **Source** | `_posts/` | `_data/activity/` | +| **Appears on** | `/news/`, the home page "Latest News" block, and `feed.xml` | `/activity/` only | +| **Review** | Normal PR review of the wording | A light check of the reporter's PR | + +**Excluded from both:** dependency and action version bumps, CI, build, deploy and publishing-workflow changes, analytics, editor-of-record and other metadata changes, translation-sync tooling, and website changes. Releases of tooling (GitHub Actions, themes, plugins) are not library releases, and a GitHub release published later for an old version is not a new release. + +**Promotion is a human decision.** When a release or a batch of lecture changes deserves wider attention, someone writes a News post that links to it. + +### Activity data + +Each reporter run adds one file per stream, `_data/activity/-.yml`, holding a list of entries. `` is `software` for releases and `lectures` for lecture and translation updates, and a run writes no file for a stream with nothing to report. Entry dates can be earlier than the file's run date. The Activity page merges every file, orders the entries by date (newest first, and in file order within a day), and groups them by month. CI checks every file against this schema (`.github/scripts/check-activity-data.rb`). + +| Field | Required | Description | +|---|---|---| +| `date` | yes | Unquoted `YYYY-MM-DD`, in UTC. For a `release`, the day it was published. For `lectures` and `translation`, the day of the first `publish-*` release that included every listed change, i.e. when it went live. | +| `type` | yes | `release`, `lectures` or `translation` | +| `project` | yes | Human-readable name, e.g. `QuantEcon.py` or `Intermediate Quantitative Economics with Python`. A translated edition is ` ()`, e.g. `Python Programming for Economics and Finance (French)`. | +| `url` | yes | The release notes (`release`) or the live site (`lectures`, `translation`) | +| `version` | `release` only | The released version tag, as a string, e.g. `v0.12.0` (quote numeric-looking versions such as `"1.10"`) | +| `summary` | no | One factual sentence describing what changed. Plain text, except that text in single backticks renders as inline code. | +| `changes` | no | List of `{title, url}` links to the pull requests behind the entry, merged into the default branch. Titles are plain text, lightly tidied: prefixes such as `[slug]`, `FIX:` or `chore:`, and internal notes, may be dropped. | + +For example, `_data/activity/2026-09-27-lectures.yml`: + +```yaml +- date: 2026-09-27 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Added three new lectures (Linear Quadratic Mean Field Games, Investment Under Uncertainty, and Optimal Growth Under Uncertainty and Tobin's q), and added exercises to the two auction lectures. + changes: + - title: Two sequels to rational_expectations + url: https://github.com/QuantEcon/lecture-python.myst/pull/1070 + - title: Add exercises and further reading + url: https://github.com/QuantEcon/lecture-python.myst/pull/1069 + - title: Add VCG comparison section and exercises + url: https://github.com/QuantEcon/lecture-python.myst/pull/1068 +``` + +and `_data/activity/2026-09-24-software.yml`: + +```yaml +- date: 2026-09-24 + type: release + project: QuantEcon.py + version: v0.12.0 + url: https://github.com/QuantEcon/QuantEcon.py/releases/tag/v0.12.0 +``` + ## News Post Tags Posts in `_posts/` use a `tag` frontmatter field with coloured pill badges on the News page. diff --git a/_data/activity/2026-06-14-lectures.yml b/_data/activity/2026-06-14-lectures.yml new file mode 100644 index 00000000..344b7bb7 --- /dev/null +++ b/_data/activity/2026-06-14-lectures.yml @@ -0,0 +1,11 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-06-14-lectures.md (removed); excluded items removed. + +- date: 2026-06-12 + type: lectures + project: Advanced Quantitative Economics with Python + url: https://python-advanced.quantecon.org/ + summary: Added three lectures on contract theory under moral hazard and a lecture, Survey Data and Subjective Beliefs in Business Cycle Models. + changes: + - title: Add three lectures on contract theory and one lecture on survey data and robustness + url: https://github.com/QuantEcon/lecture-python-advanced.myst/pull/343 diff --git a/_data/activity/2026-06-21-lectures.yml b/_data/activity/2026-06-21-lectures.yml new file mode 100644 index 00000000..0f8dbacf --- /dev/null +++ b/_data/activity/2026-06-21-lectures.yml @@ -0,0 +1,15 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-06-21-lectures.md (removed); excluded items removed. + +- date: 2026-06-19 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Rewrote the Non-Conjugate Priors lecture, adding notes on NUTS and variational inference, and revised the exposition and notation of Another Look at the Kalman Filter. + changes: + - title: 'Add explanatory notes to bayes_nonconj: NUTS and variational inference' + url: https://github.com/QuantEcon/lecture-python.myst/pull/918 + - title: Rewrite the Non-Conjugate Priors lecture + url: https://github.com/QuantEcon/lecture-python.myst/pull/913 + - title: Update exposition of first three sections + url: https://github.com/QuantEcon/lecture-python.myst/pull/903 diff --git a/_data/activity/2026-06-28-lectures.yml b/_data/activity/2026-06-28-lectures.yml new file mode 100644 index 00000000..959637cb --- /dev/null +++ b/_data/activity/2026-06-28-lectures.yml @@ -0,0 +1,11 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-06-28-lectures.md (removed); excluded items removed. + +- date: 2026-06-22 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Added three new lectures, including The Kalman Filter and Vector Autoregressions and Robust Permanent Income and Pricing. + changes: + - title: Adding Tom's new lectures on Kalman Filter and Robust Income + url: https://github.com/QuantEcon/lecture-python.myst/pull/931 diff --git a/_data/activity/2026-07-05-lectures.yml b/_data/activity/2026-07-05-lectures.yml new file mode 100644 index 00000000..661bd880 --- /dev/null +++ b/_data/activity/2026-07-05-lectures.yml @@ -0,0 +1,13 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-07-05-lectures.md (removed); excluded items removed. + +- date: 2026-07-02 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Replaced the LQ Consumption Smoothing lecture with a trilogy of lectures on the LQ permanent income model, and added two lectures on unemployment dynamics, A Linear Model of Unemployment and Unemployment Dynamics with Asymmetric Shocks. + changes: + - title: Add Tom's LQ permanent income trilogy of lectures + url: https://github.com/QuantEcon/lecture-python.myst/pull/943 + - title: Add unemployment dynamics lectures (linear + nonlinear) + url: https://github.com/QuantEcon/lecture-python.myst/pull/928 diff --git a/_data/activity/2026-07-06-software.yml b/_data/activity/2026-07-06-software.yml new file mode 100644 index 00000000..3c86dc15 --- /dev/null +++ b/_data/activity/2026-07-06-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-07-06-software.md (removed); excluded items removed. + +- date: 2026-07-06 + type: release + project: ContinuousDPs.jl + version: v0.2.0 + url: https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.2.0 diff --git a/_data/activity/2026-07-08-software.yml b/_data/activity/2026-07-08-software.yml new file mode 100644 index 00000000..3cbf6fe8 --- /dev/null +++ b/_data/activity/2026-07-08-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-07-08-software.md (removed); excluded items removed. + +- date: 2026-07-08 + type: release + project: QuantEcon.py + version: v0.11.3 + url: https://github.com/QuantEcon/QuantEcon.py/releases/tag/v0.11.3 diff --git a/_data/activity/2026-07-12-lectures.yml b/_data/activity/2026-07-12-lectures.yml new file mode 100644 index 00000000..4bcb961e --- /dev/null +++ b/_data/activity/2026-07-12-lectures.yml @@ -0,0 +1,19 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-07-12-lectures.md (removed); excluded items removed. + +- date: 2026-07-07 + type: lectures + project: Advanced Quantitative Economics with Python + url: https://python-advanced.quantecon.org/ + summary: Added a new lecture, Dynamic Supply and Demand Curves. + changes: + - title: Adding Tom's lecture on dynamic supply and demand curves + url: https://github.com/QuantEcon/lecture-python-advanced.myst/pull/352 +- date: 2026-07-07 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Added missing `pip install` cells to four lectures. + changes: + - title: Add missing pip dependencies + url: https://github.com/QuantEcon/lecture-python.myst/pull/951 diff --git a/_data/activity/2026-07-13-software.yml b/_data/activity/2026-07-13-software.yml new file mode 100644 index 00000000..3fa23d91 --- /dev/null +++ b/_data/activity/2026-07-13-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-07-13-software.md (removed); excluded items removed. + +- date: 2026-07-13 + type: release + project: QuantEcon.jl + version: v0.18.0 + url: https://github.com/QuantEcon/QuantEcon.jl/releases/tag/v0.18.0 diff --git a/_data/activity/2026-07-15-software.yml b/_data/activity/2026-07-15-software.yml new file mode 100644 index 00000000..76490928 --- /dev/null +++ b/_data/activity/2026-07-15-software.yml @@ -0,0 +1,28 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's post _posts/2026-07-15-software.md (removed); excluded items removed. + +- date: 2026-07-15 + type: release + project: QuantEcon.py + version: v0.11.4 + url: https://github.com/QuantEcon/QuantEcon.py/releases/tag/v0.11.4 +- date: 2026-07-15 + type: release + project: GameTheory.jl + version: v0.7.0 + url: https://github.com/QuantEcon/GameTheory.jl/releases/tag/v0.7.0 +- date: 2026-07-15 + type: release + project: BasisMatrices.jl + version: v0.8.1 + url: https://github.com/QuantEcon/BasisMatrices.jl/releases/tag/v0.8.1 +- date: 2026-07-15 + type: release + project: ContinuousDPs.jl + version: v0.2.1 + url: https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.2.1 +- date: 2026-07-15 + type: release + project: GameTracer.jl + version: v0.1.2 + url: https://github.com/QuantEcon/GameTracer.jl/releases/tag/v0.1.2 diff --git a/_data/activity/2026-07-20-software.yml b/_data/activity/2026-07-20-software.yml new file mode 100644 index 00000000..ca749006 --- /dev/null +++ b/_data/activity/2026-07-20-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#241; excluded items removed. + +- date: 2026-07-20 + type: release + project: ContinuousDPs.jl + version: v0.3.0 + url: https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.3.0 diff --git a/_data/activity/2026-07-26-lectures.yml b/_data/activity/2026-07-26-lectures.yml new file mode 100644 index 00000000..7db8dc33 --- /dev/null +++ b/_data/activity/2026-07-26-lectures.yml @@ -0,0 +1,13 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#242; excluded items removed. + +- date: 2026-07-23 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Added a new section of ten lectures on Phillips Curve Tradeoffs, and added figure captions and standardized CDF notation in the Incorrect Models lecture. + changes: + - title: Adding Tom's new section on Phillips Curve Tradeoffs + url: https://github.com/QuantEcon/lecture-python.myst/pull/992 + - title: Add figure captions and use CDF + url: https://github.com/QuantEcon/lecture-python.myst/pull/982 diff --git a/_data/activity/2026-07-26-software.yml b/_data/activity/2026-07-26-software.yml new file mode 100644 index 00000000..77badd85 --- /dev/null +++ b/_data/activity/2026-07-26-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#243; excluded items removed. + +- date: 2026-07-26 + type: release + project: ContinuousDPs.jl + version: v0.3.1 + url: https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.3.1 diff --git a/_data/activity/2026-08-02-lectures.yml b/_data/activity/2026-08-02-lectures.yml new file mode 100644 index 00000000..cd6792ac --- /dev/null +++ b/_data/activity/2026-08-02-lectures.yml @@ -0,0 +1,11 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#246; excluded items removed. + +- date: 2026-07-26 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Added missing `quantecon` and `jax` installs to nine lectures. + changes: + - title: Add pip install cells for quantecon and jax in lectures that were missing them + url: https://github.com/QuantEcon/lecture-python.myst/pull/1006 diff --git a/_data/activity/2026-08-02-software.yml b/_data/activity/2026-08-02-software.yml new file mode 100644 index 00000000..b8f43221 --- /dev/null +++ b/_data/activity/2026-08-02-software.yml @@ -0,0 +1,23 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#247; excluded items removed. + +- date: 2026-08-02 + type: release + project: QuantEcon.jl + version: v0.19.0 + url: https://github.com/QuantEcon/QuantEcon.jl/releases/tag/v0.19.0 +- date: 2026-08-02 + type: release + project: GameTheory.jl + version: v0.7.1 + url: https://github.com/QuantEcon/GameTheory.jl/releases/tag/v0.7.1 +- date: 2026-08-02 + type: release + project: BasisMatrices.jl + version: v0.8.2 + url: https://github.com/QuantEcon/BasisMatrices.jl/releases/tag/v0.8.2 +- date: 2026-08-02 + type: release + project: ContinuousDPs.jl + version: v0.3.2 + url: https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.3.2 diff --git a/_data/activity/2026-08-09-lectures.yml b/_data/activity/2026-08-09-lectures.yml new file mode 100644 index 00000000..31a13fc8 --- /dev/null +++ b/_data/activity/2026-08-09-lectures.yml @@ -0,0 +1,43 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#251; excluded items removed. + +- date: 2026-08-06 + type: lectures + project: A First Course in Quantitative Economics with Python + url: https://intro.quantecon.org/ + summary: Added a new lecture, Fitting Distributions to Data. + changes: + - title: 'New lecture: Fitting Distributions to Data' + url: https://github.com/QuantEcon/lecture-python-intro/pull/814 +- date: 2026-08-03 + type: lectures + project: Python Programming for Economics and Finance + url: https://python-programming.quantecon.org/ + summary: Added a language switcher linking to the Persian, French and Simplified Chinese editions. + changes: + - title: Add language switcher support for fa, fr and zh-cn editions + url: https://github.com/QuantEcon/lecture-python-programming/pull/490 +- date: 2026-08-03 + type: translation + project: Python Programming for Economics and Finance (Persian) + url: https://quantecon.github.io/lecture-python-programming.fa/ + summary: Enabled the language switcher between the English, Persian, French and Simplified Chinese editions. + changes: + - title: Enable the language switcher and fix this edition's site URLs + url: https://github.com/QuantEcon/lecture-python-programming.fa/pull/145 +- date: 2026-08-03 + type: translation + project: Python Programming for Economics and Finance (French) + url: https://quantecon.github.io/lecture-python-programming.fr/ + summary: Enabled the language switcher between the English, Persian, French and Simplified Chinese editions. + changes: + - title: Enable the language switcher for the French edition + url: https://github.com/QuantEcon/lecture-python-programming.fr/pull/21 +- date: 2026-08-03 + type: translation + project: Python Programming for Economics and Finance (Simplified Chinese) + url: https://quantecon.github.io/lecture-python-programming.zh-cn/ + summary: Enabled the language switcher between the English, Persian, French and Simplified Chinese editions. + changes: + - title: Enable the language switcher and fix URLs copied from the English config + url: https://github.com/QuantEcon/lecture-python-programming.zh-cn/pull/80 diff --git a/_data/activity/2026-08-12-software.yml b/_data/activity/2026-08-12-software.yml new file mode 100644 index 00000000..f2a2d031 --- /dev/null +++ b/_data/activity/2026-08-12-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#252; excluded items removed. + +- date: 2026-08-12 + type: release + project: Expectations.jl + version: v1.9.3 + url: https://github.com/QuantEcon/Expectations.jl/releases/tag/v1.9.3 diff --git a/_data/activity/2026-08-23-lectures.yml b/_data/activity/2026-08-23-lectures.yml new file mode 100644 index 00000000..90473857 --- /dev/null +++ b/_data/activity/2026-08-23-lectures.yml @@ -0,0 +1,21 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#255; excluded items removed. + +- date: 2026-08-19 + type: lectures + project: A First Course in Quantitative Economics with Python + url: https://intro.quantecon.org/ + summary: Added two new lectures, Measuring Mobility and Bivariate Distributions. + changes: + - title: Add Measuring Mobility lecture + url: https://github.com/QuantEcon/lecture-python-intro/pull/839 + - title: Add Bivariate Distributions lecture + url: https://github.com/QuantEcon/lecture-python-intro/pull/837 +- date: 2026-08-20 + type: translation + project: A First Course in Quantitative Economics with Python (Simplified Chinese) + url: https://quantecon.github.io/lecture-intro.zh-cn/ + summary: Added the Simplified Chinese translation of the Measuring Mobility lecture. + changes: + - title: Add the Measuring Mobility lecture + url: https://github.com/QuantEcon/lecture-intro.zh-cn/pull/299 diff --git a/_data/activity/2026-09-14-software.yml b/_data/activity/2026-09-14-software.yml new file mode 100644 index 00000000..437013f9 --- /dev/null +++ b/_data/activity/2026-09-14-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#258; excluded items removed. + +- date: 2026-09-14 + type: release + project: gametracer + version: 0.2.2 + url: https://github.com/QuantEcon/gametracer/releases/tag/0.2.2 diff --git a/_data/activity/2026-09-16-software.yml b/_data/activity/2026-09-16-software.yml new file mode 100644 index 00000000..be91e999 --- /dev/null +++ b/_data/activity/2026-09-16-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#259; excluded items removed. + +- date: 2026-09-16 + type: release + project: GameTracer.jl + version: v0.2.0 + url: https://github.com/QuantEcon/GameTracer.jl/releases/tag/v0.2.0 diff --git a/_data/activity/2026-09-23-software.yml b/_data/activity/2026-09-23-software.yml new file mode 100644 index 00000000..0063a75d --- /dev/null +++ b/_data/activity/2026-09-23-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#261; excluded items removed. + +- date: 2026-09-23 + type: release + project: GameTheory.jl + version: v0.7.2 + url: https://github.com/QuantEcon/GameTheory.jl/releases/tag/v0.7.2 diff --git a/_data/activity/2026-09-24-software.yml b/_data/activity/2026-09-24-software.yml new file mode 100644 index 00000000..3cf8b4c7 --- /dev/null +++ b/_data/activity/2026-09-24-software.yml @@ -0,0 +1,8 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#262; excluded items removed. + +- date: 2026-09-24 + type: release + project: QuantEcon.py + version: v0.12.0 + url: https://github.com/QuantEcon/QuantEcon.py/releases/tag/v0.12.0 diff --git a/_data/activity/2026-09-27-lectures.yml b/_data/activity/2026-09-27-lectures.yml new file mode 100644 index 00000000..ba484ec7 --- /dev/null +++ b/_data/activity/2026-09-27-lectures.yml @@ -0,0 +1,15 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Migrated from the reporter's draft PR QuantEcon/website#263; excluded items removed. + +- date: 2026-09-27 + type: lectures + project: Intermediate Quantitative Economics with Python + url: https://python.quantecon.org/ + summary: Added three new lectures (Linear Quadratic Mean Field Games, Investment Under Uncertainty, and Optimal Growth Under Uncertainty and Tobin's q), and added exercises to the two auction lectures. + changes: + - title: Two sequels to rational_expectations + url: https://github.com/QuantEcon/lecture-python.myst/pull/1070 + - title: Add exercises and further reading + url: https://github.com/QuantEcon/lecture-python.myst/pull/1069 + - title: Add VCG comparison section and exercises + url: https://github.com/QuantEcon/lecture-python.myst/pull/1068 diff --git a/_data/activity/2026-09-28-software.yml b/_data/activity/2026-09-28-software.yml new file mode 100644 index 00000000..fcd20d8d --- /dev/null +++ b/_data/activity/2026-09-28-software.yml @@ -0,0 +1,28 @@ +# Activity data: see "News and Activity" in README.md for the schema. +# Library releases the reporter missed, added by hand when Activity was introduced. + +- date: 2026-06-14 + type: release + project: GameTheory.jl + version: v0.6.0 + url: https://github.com/QuantEcon/GameTheory.jl/releases/tag/v0.6.0 +- date: 2026-06-14 + type: release + project: GameTracer.jl + version: v0.1.1 + url: https://github.com/QuantEcon/GameTracer.jl/releases/tag/v0.1.1 +- date: 2026-06-20 + type: release + project: jlgametheory + version: v0.1.2 + url: https://github.com/QuantEcon/jlgametheory/releases/tag/v0.1.2 +- date: 2026-08-16 + type: release + project: jlgametheory + version: v0.2.0 + url: https://github.com/QuantEcon/jlgametheory/releases/tag/v0.2.0 +- date: 2026-09-19 + type: release + project: jlgametheory + version: v0.3.0 + url: https://github.com/QuantEcon/jlgametheory/releases/tag/v0.3.0 diff --git a/_layouts/activity.html b/_layouts/activity.html new file mode 100644 index 00000000..1ba085e0 --- /dev/null +++ b/_layouts/activity.html @@ -0,0 +1,56 @@ +--- +layout: default +--- + +{{ content }} + +{% comment %} + Activity entries live in _data/activity/-.yml, one file per + reporter run and stream (see "News and Activity" in README.md). Flatten every file into one + list, group it by day (group_by_exp keeps file order within a day), sort the days + newest first, then group the days by month. Sorting whole days rather than + entries keeps the order stable, since Liquid's sort is not a stable sort. +{% endcomment %} +{% assign entries = "" | split: "" %} +{% for file in site.data.activity %} + {% assign entries = entries | concat: file[1] %} +{% endfor %} +{% assign days = entries | group_by_exp: "entry", "entry.date | date: '%Y-%m-%d'" | sort: "name" | reverse %} +{% assign months = days | group_by_exp: "day", "day.name | slice: 0, 7" %} + +
+ {% for month in months %} +
+

{{ month.items[0].items[0].date | date: "%B %Y" }}

+
    + {% for day in month.items %} + {% for entry in day.items %} +
  • + +
    +

    + {{ entry.type }} + {{ entry.project | escape }}{% if entry.version %} {{ entry.version | escape }}{% endif %} +

    + {% if entry.summary %} + {% comment %} Plain text, except that `backtick` spans become inline code. {% endcomment %} + {% assign parts = entry.summary | escape | split: "`" %} +

    {% for part in parts %}{% assign odd = forloop.index0 | modulo: 2 %}{% if odd == 1 %}{{ part }}{% else %}{{ part }}{% endif %}{% endfor %}

    + {% endif %} + {% if entry.changes %} + + {% endif %} +
    +
  • + {% endfor %} + {% endfor %} +
+
+ {% else %} +

No activity has been recorded yet.

+ {% endfor %} +
diff --git a/_layouts/default.html b/_layouts/default.html index 396b5cc3..304c3e85 100755 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -76,10 +76,11 @@

QuantEcon

Lectures Workshops Books - @@ -148,6 +149,7 @@

Resources

  • Code Libraries
  • Workshops
  • News
  • +
  • Activity
  • Cheatsheets
  • diff --git a/_posts/2026-06-14-lectures.md b/_posts/2026-06-14-lectures.md deleted file mode 100644 index d3a08388..00000000 --- a/_posts/2026-06-14-lectures.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: post -title: "Lecture updates — June 8–14, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon lectures." -tag: [lectures] ---- - -- 📚 **[Advanced Quantitative Economics with Python](https://python-advanced.quantecon.org/)** — New lectures on contract theory (principal-agent problems) and survey data robustness expanded the course's coverage of applied microeconomic theory and empirical methods. - - [Add three lectures on contract theory and one lecture on survey data and robustness](https://github.com/QuantEcon/lecture-python-advanced.myst/pull/343) diff --git a/_posts/2026-06-14-website.md b/_posts/2026-06-14-website.md deleted file mode 100644 index 9a7025a5..00000000 --- a/_posts/2026-06-14-website.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: post -title: "Website update — June 8–14, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon website." -tag: [website] ---- - -- 🏠 **[quantecon.org](https://quantecon.org/)** — Converted workshops to a Jekyll collection and added redirects for removed developer pages to their new locations on quantecon.org. - - [convert workshops to a Jekyll collection](https://github.com/QuantEcon/website/pull/204) - - [redirect removed developer pages to their new homes](https://github.com/QuantEcon/website/pull/209) diff --git a/_posts/2026-06-21-lectures.md b/_posts/2026-06-21-lectures.md deleted file mode 100644 index b53ff4cd..00000000 --- a/_posts/2026-06-21-lectures.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -layout: post -title: "Lecture updates — June 14–21, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon lectures." -tag: [lectures] ---- - -- 📚 **[Quantitative Economics with Python](https://python.quantecon.org/)** — Rewrote the non-conjugate priors lecture with improved NUTS and variational inference explanations, and enhanced the Kalman filter lecture's opening exposition. - - [Add explanatory notes to bayes_nonconj: NUTS and variational inference](https://github.com/QuantEcon/lecture-python.myst/pull/918) - - [Rewrite the Non-Conjugate Priors lecture](https://github.com/QuantEcon/lecture-python.myst/pull/913) - - [update exposition of first three sections](https://github.com/QuantEcon/lecture-python.myst/pull/903) diff --git a/_posts/2026-06-21-website.md b/_posts/2026-06-21-website.md deleted file mode 100644 index e192e25a..00000000 --- a/_posts/2026-06-21-website.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: post -title: "Website update — June 14–21, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon website." -tag: [website] ---- - -- 🏠 **[quantecon.org](https://quantecon.org/)** — Added inline news tags for website and software content to improve categorization and visual organization on quantecon.org. - - [news tags for website/software, placed inline with title](https://github.com/QuantEcon/website/pull/220) diff --git a/_posts/2026-06-28-lectures.md b/_posts/2026-06-28-lectures.md deleted file mode 100644 index e89039fc..00000000 --- a/_posts/2026-06-28-lectures.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: post -title: "Lecture updates — June 21–28, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon lectures." -tag: [lectures] ---- - -- 📚 **[Quantitative Economics with Python](https://python.quantecon.org/)** — New lectures on the Kalman Filter and Robust Income were integrated into the Quantitative Economics with Python curriculum. - - [Adding Tom's new lectures on Kalman Filter and Robust Income](https://github.com/QuantEcon/lecture-python.myst/pull/931) diff --git a/_posts/2026-07-05-lectures.md b/_posts/2026-07-05-lectures.md deleted file mode 100644 index 99635f76..00000000 --- a/_posts/2026-07-05-lectures.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: post -title: "Lecture updates — June 28 – July 5, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon lectures." -tag: [lectures] ---- - -- 📚 **[Quantitative Economics with Python](https://python.quantecon.org/)** — Added lectures covering LQ permanent income theory and unemployment dynamics (both linear and nonlinear models) to the Quantitative Economics with Python curriculum. - - [Add Tom's LQ permanent income trilogy of lectures](https://github.com/QuantEcon/lecture-python.myst/pull/943) - - [Add unemployment dynamics lectures (linear + nonlinear)](https://github.com/QuantEcon/lecture-python.myst/pull/928) diff --git a/_posts/2026-07-06-software.md b/_posts/2026-07-06-software.md deleted file mode 100644 index f0c8521b..00000000 --- a/_posts/2026-07-06-software.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: post -title: "Software releases — July 6, 2026" -author: QuantEcon -excerpt: "New QuantEcon software and library releases." -tag: [software] ---- - -- 📦 **[ContinuousDPs.jl v0.2.0 released](https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.2.0)** diff --git a/_posts/2026-07-08-software.md b/_posts/2026-07-08-software.md deleted file mode 100644 index 1ae5879c..00000000 --- a/_posts/2026-07-08-software.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: post -title: "Software releases — July 8, 2026" -author: QuantEcon -excerpt: "New QuantEcon software and library releases." -tag: [software] ---- - -- 📦 **[QuantEcon.py v0.11.3 released](https://github.com/QuantEcon/QuantEcon.py/releases/tag/v0.11.3)** diff --git a/_posts/2026-07-12-lectures.md b/_posts/2026-07-12-lectures.md deleted file mode 100644 index fcfa02ad..00000000 --- a/_posts/2026-07-12-lectures.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: post -title: "Lecture updates — July 5–12, 2026" -author: QuantEcon -excerpt: "Updates to the QuantEcon lectures." -tag: [lectures] ---- - -- 📚 **[Quantitative Economics with Python](https://python.quantecon.org/)** — Fixed missing `pip` dependencies to ensure reliable environment setup for quantitative economics Python workflows. - - [Add missing `pip` dependencies](https://github.com/QuantEcon/lecture-python.myst/pull/951) - -- 📚 **[Advanced Quantitative Economics with Python](https://python-advanced.quantecon.org/)** — Added a new lecture on dynamic supply and demand curves using vector autoregression, expanding the quantitative economics curriculum with advanced time-series modeling of market dynamics. - - [Adding Tom's lecture on dynamic supply and demand curves](https://github.com/QuantEcon/lecture-python-advanced.myst/pull/352) - -- 📚 **[A First Course in Quantitative Economics with Python](https://intro.quantecon.org/)** — Migrated GitHub Pages deployment to artifact-based deployment, modernizing the publishing infrastructure for the quantitative economics Python course. - - [Migrate GH Pages deploy to artifact-based deployment](https://github.com/QuantEcon/lecture-python-intro/pull/783) diff --git a/_posts/2026-07-13-software.md b/_posts/2026-07-13-software.md deleted file mode 100644 index 84340364..00000000 --- a/_posts/2026-07-13-software.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: post -title: "Software releases — July 13, 2026" -author: QuantEcon -excerpt: "New QuantEcon software and library releases." -tag: [software] ---- - -- 📦 **[QuantEcon.jl v0.18.0 released](https://github.com/QuantEcon/QuantEcon.jl/releases/tag/v0.18.0)** diff --git a/_posts/2026-07-15-software.md b/_posts/2026-07-15-software.md deleted file mode 100644 index dab507d5..00000000 --- a/_posts/2026-07-15-software.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: post -title: "Software releases — July 15, 2026" -author: QuantEcon -excerpt: "New QuantEcon software and library releases." -tag: [software] ---- - -- 📦 **[GameTracer.jl v0.1.2 released](https://github.com/QuantEcon/GameTracer.jl/releases/tag/v0.1.2)** -- 📦 **[ContinuousDPs.jl v0.2.1 released](https://github.com/QuantEcon/ContinuousDPs.jl/releases/tag/v0.2.1)** -- 📦 **[BasisMatrices.jl v0.7.1 released](https://github.com/QuantEcon/BasisMatrices.jl/releases/tag/v0.7.1)** -- 📦 **[BasisMatrices.jl v0.8.1 released](https://github.com/QuantEcon/BasisMatrices.jl/releases/tag/v0.8.1)** -- 📦 **[GameTheory.jl v0.7.0 released](https://github.com/QuantEcon/GameTheory.jl/releases/tag/v0.7.0)** -- 📦 **[QuantEcon.py v0.11.4 released](https://github.com/QuantEcon/QuantEcon.py/releases/tag/v0.11.4)** diff --git a/assets/main.scss b/assets/main.scss index ee683971..b4130997 100755 --- a/assets/main.scss +++ b/assets/main.scss @@ -645,12 +645,13 @@ img { background: $qe-red; color: #fff; } - &--website { - background: #2a9d8f; + // Activity entry types + &--release { + background: #9558b2; color: #fff; } - &--software { - background: #9558b2; + &--translation { + background: #1f7a70; // teal darkened from #2a9d8f to pass WCAG AA with white text color: #fff; } &--tools { @@ -1468,6 +1469,95 @@ section { } } +/*-------------------------------------------------------------- +# Activity +--------------------------------------------------------------*/ + +.activity-month { + // Reset the global `section` padding and overflow. + padding: 0; + overflow: visible; + margin-bottom: 2.5rem; +} + +.activity-feed { + margin-top: 2.5rem; +} + +.activity-month-title { + font-family: $font-brand; + font-weight: 400; + font-size: 1.4rem; + color: $color-dark; + padding-bottom: 0.5rem; + margin-bottom: 0; + border-bottom: 1px solid $color-border; +} + +.activity-list { + list-style: none; + padding: 0; + margin: 0; +} + +.activity-item { + display: flex; + gap: 1rem; + padding: 0.9rem 0; + border-bottom: 1px solid #edf0f5; + &:last-child { border-bottom: 0; } +} + +.activity-date { + flex: 0 0 4rem; + font-size: 0.8rem; + color: #666; // not the site's #888 meta grey, which fails WCAG AA at this size + padding-top: 0.15rem; +} + +.activity-main { + flex: 1; + min-width: 0; +} + +.activity-title { + margin: 0; + font-weight: 600; + font-size: 0.95rem; + color: $color-dark; + .qe-badge { + display: inline-block; + margin: 0 0.5rem 0 0; + vertical-align: middle; + } +} + +.activity-summary { + font-size: 0.9rem; + color: #555; + line-height: 1.5; + margin: 0.3rem 0 0 0; +} + +.activity-changes { + font-size: 0.85rem; + line-height: 1.5; + margin: 0.3rem 0 0 0; + padding-left: 1.1rem; + color: #888; +} + +@media (max-width: 576px) { + .activity-item { + flex-direction: column; + gap: 0.25rem; + } + .activity-date { + flex-basis: auto; + padding-top: 0; + } +} + /* Individual post article */ .post-article { max-width: 760px; diff --git a/pages/activity.md b/pages/activity.md new file mode 100644 index 00000000..37862601 --- /dev/null +++ b/pages/activity.md @@ -0,0 +1,25 @@ +--- +title: Activity +layout: activity +permalink: /activity/ +menu_item: true +# The reporter's posts lived in _posts/ until the News/Activity split; keep their URLs working. +redirect_from: + - /2026/06/14/lectures.html + - /2026/06/14/website.html + - /2026/06/21/lectures.html + - /2026/06/21/website.html + - /2026/06/28/lectures.html + - /2026/07/05/lectures.html + - /2026/07/06/software.html + - /2026/07/08/software.html + - /2026/07/12/lectures.html + - /2026/07/13/software.html + - /2026/07/15/software.html +--- + +# Activity + +A running log of what is changing across QuantEcon: library releases, updates to the lecture series, and updates to their translated editions. It is compiled from public activity on [GitHub](https://github.com/QuantEcon). + +For announcements such as new projects, grants, people and workshops, see [News](/news/). diff --git a/pages/archives.md b/pages/archives.md index 9b2adf03..f36cedb4 100755 --- a/pages/archives.md +++ b/pages/archives.md @@ -6,3 +6,5 @@ menu_item: true --- # News + +Announcements from QuantEcon: new projects, grants, people and workshops. For library releases and lecture updates, see [Activity](/activity/). diff --git a/sitemap.xml b/sitemap.xml index c1f3f031..25006154 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -7,12 +7,14 @@ search: exclude {% for page in site.pages %} + {% unless page.sitemap == false %} {{ page.url | absolute_url }} {{site.time | date: '%Y-%m-%d' }} daily 0.5 + {% endunless %} {% endfor %} {% for post in site.posts %} From 18dd6081e16fa2706d25c17285326412e396623a Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Mon, 28 Sep 2026 12:45:08 +1000 Subject: [PATCH 2/6] activity: sort data files explicitly; darken the changes list - Concatenate _data/activity/ files in sorted filename order instead of relying on Jekyll's hash insertion order, so the documented "file order within a day" doesn't depend on how Jekyll reads the directory. - Use #666 for the .activity-changes list (bullet markers), matching the dates, instead of the #888 that fails WCAG AA for text. Co-Authored-By: Claude Opus 5.5 --- _layouts/activity.html | 15 ++++++++++----- assets/main.scss | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/_layouts/activity.html b/_layouts/activity.html index 1ba085e0..138ab99f 100644 --- a/_layouts/activity.html +++ b/_layouts/activity.html @@ -7,13 +7,18 @@ {% comment %} Activity entries live in _data/activity/-.yml, one file per reporter run and stream (see "News and Activity" in README.md). Flatten every file into one - list, group it by day (group_by_exp keeps file order within a day), sort the days - newest first, then group the days by month. Sorting whole days rather than - entries keeps the order stable, since Liquid's sort is not a stable sort. + list in filename order, group it by day (group_by_exp keeps that order within a day), + sort the days newest first, then group the days by month. Sorting whole days rather + than entries keeps the order stable, since Liquid's sort is not a stable sort. {% endcomment %} -{% assign entries = "" | split: "" %} +{% assign files = "" | split: "" %} {% for file in site.data.activity %} - {% assign entries = entries | concat: file[1] %} + {% assign files = files | push: file[0] %} +{% endfor %} +{% assign files = files | sort %} +{% assign entries = "" | split: "" %} +{% for file in files %} + {% assign entries = entries | concat: site.data.activity[file] %} {% endfor %} {% assign days = entries | group_by_exp: "entry", "entry.date | date: '%Y-%m-%d'" | sort: "name" | reverse %} {% assign months = days | group_by_exp: "day", "day.name | slice: 0, 7" %} diff --git a/assets/main.scss b/assets/main.scss index b4130997..ef452448 100755 --- a/assets/main.scss +++ b/assets/main.scss @@ -1544,7 +1544,7 @@ section { line-height: 1.5; margin: 0.3rem 0 0 0; padding-left: 1.1rem; - color: #888; + color: #666; } @media (max-width: 576px) { From fdd6fee5edc325a902931ea9a9bc335cf2b2ccf1 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Mon, 28 Sep 2026 20:11:30 +1000 Subject: [PATCH 3/6] README: define News and Activity by type of information, not by page The definitions now decide only which stream an item belongs to (what goes in, who writes it). Where each stream is shown is a design choice, tracked separately, so the "Appears on" row moves out of the table into a note on the current placement. Co-Authored-By: Claude Opus 5.5 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b5ce4e22..4a580cd9 100644 --- a/README.md +++ b/README.md @@ -12,18 +12,18 @@ bundle exec jekyll serve The site has two streams of updates. The rule of thumb: **people write News, the reporter bot writes Activity.** The bot never publishes to News. -| | News ([/news/](https://quantecon.org/news/)) | Activity ([/activity/](https://quantecon.org/activity/)) | +| | News | Activity | |---|---|---| | **What goes in** | New projects (a new lecture series, book, a library's first public release, or a new language edition of a lecture series), grants and funding, people (RAs, team changes, open positions), workshops, tutorials and talks, partnerships, and changes that affect users | Every library release; changes to existing lecture series (new lectures, new sections and exercises, substantive revisions, fixes a reader would notice); updates to translated editions | | **Written by** | A person | The reporter bot (maintained in the private `QuantEcon/reports-activity` repository) | -| **Source** | `_posts/` | `_data/activity/` | -| **Appears on** | `/news/`, the home page "Latest News" block, and `feed.xml` | `/activity/` only | | **Review** | Normal PR review of the wording | A light check of the reporter's PR | **Excluded from both:** dependency and action version bumps, CI, build, deploy and publishing-workflow changes, analytics, editor-of-record and other metadata changes, translation-sync tooling, and website changes. Releases of tooling (GitHub Actions, themes, plugins) are not library releases, and a GitHub release published later for an old version is not a new release. **Promotion is a human decision.** When a release or a batch of lecture changes deserves wider attention, someone writes a News post that links to it. +These definitions decide which stream an item belongs to, not where it is shown. News posts are stored in `_posts/` and Activity entries in `_data/activity/` (schema below). Which pages display each stream is a design choice: today News appears on `/news/`, the home page and `feed.xml`, and Activity on `/activity/`. + ### Activity data Each reporter run adds one file per stream, `_data/activity/-.yml`, holding a list of entries. `` is `software` for releases and `lectures` for lecture and translation updates, and a run writes no file for a stream with nothing to report. Entry dates can be earlier than the file's run date. The Activity page merges every file, orders the entries by date (newest first, and in file order within a day), and groups them by month. CI checks every file against this schema (`.github/scripts/check-activity-data.rb`). From 318ad2509e955a00cf7636889d82560f5ab124eb Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Mon, 28 Sep 2026 20:55:16 +1000 Subject: [PATCH 4/6] activity: treat /activity/ as part of News in the nav; tighten data checks - Remove Activity from the Projects menu. The News item is now active on /activity/ as well as /news/; Activity stays linked from the footer and the /news/ intro. (Decided on #266.) - check-activity-data.rb: a translation's project must be " ()", and each change URL must be a GitHub pull-request URL. The planned row design parses the language from the first and prints #N from the second. Co-Authored-By: Claude Opus 5.5 --- .github/scripts/check-activity-data.rb | 8 ++++++-- README.md | 2 +- _layouts/default.html | 5 ++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/scripts/check-activity-data.rb b/.github/scripts/check-activity-data.rb index 83d4f75f..34397480 100644 --- a/.github/scripts/check-activity-data.rb +++ b/.github/scripts/check-activity-data.rb @@ -8,6 +8,7 @@ DATA_DIR = File.expand_path("../../_data/activity", __dir__) TYPES = %w[release lectures translation].freeze REQUIRED = %w[date type project url].freeze +PULL_URL = %r{\Ahttps://github\.com/[^/]+/[^/]+/pull/\d+\z} def blank?(value) value.nil? || value.to_s.strip.empty? @@ -44,6 +45,9 @@ def blank?(value) errors << "#{where}: date must be an unquoted YYYY-MM-DD date" if entry["date"] && !entry["date"].is_a?(Date) errors << "#{where}: type must be one of #{TYPES.join(', ')}" if entry["type"] && !TYPES.include?(entry["type"]) errors << "#{where}: url must start with https://" unless blank?(entry["url"]) || entry["url"].to_s.start_with?("https://") + if entry["type"] == "translation" && !entry["project"].to_s.match?(/\A.+ \([^)]+\)\z/) + errors << "#{where}: a translation's project must be \" ()\"" + end if entry["type"] == "release" && !(entry["version"].is_a?(String) && !blank?(entry["version"])) errors << "#{where}: release entries need a version, written as a string (quote numeric-looking versions)" end @@ -64,8 +68,8 @@ def blank?(value) errors << "#{where}: changes must not be an empty list (omit the key instead)" if entry.key?("changes") && changes.empty? changes.each_with_index do |change, j| next if change.is_a?(Hash) && change["title"].is_a?(String) && !blank?(change["title"]) && - change["url"].to_s.start_with?("https://") - errors << "#{where}, change #{j + 1}: needs a string title and an https:// url" + change["url"].to_s.match?(PULL_URL) + errors << "#{where}, change #{j + 1}: needs a string title and a GitHub pull-request url" end end end diff --git a/README.md b/README.md index 4a580cd9..400cd35f 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Each reporter run adds one file per stream, `_data/activity/-. | `url` | yes | The release notes (`release`) or the live site (`lectures`, `translation`) | | `version` | `release` only | The released version tag, as a string, e.g. `v0.12.0` (quote numeric-looking versions such as `"1.10"`) | | `summary` | no | One factual sentence describing what changed. Plain text, except that text in single backticks renders as inline code. | -| `changes` | no | List of `{title, url}` links to the pull requests behind the entry, merged into the default branch. Titles are plain text, lightly tidied: prefixes such as `[slug]`, `FIX:` or `chore:`, and internal notes, may be dropped. | +| `changes` | no | List of `{title, url}` links to the pull requests behind the entry (GitHub pull-request URLs), merged into the default branch. Titles are plain text, lightly tidied: prefixes such as `[slug]`, `FIX:` or `chore:`, and internal notes, may be dropped. | For example, `_data/activity/2026-09-27-lectures.yml`: diff --git a/_layouts/default.html b/_layouts/default.html index 304c3e85..bb7408c2 100755 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -76,11 +76,10 @@

    QuantEcon

    Lectures Workshops Books - @@ -93,7 +92,7 @@

    QuantEcon

  • Donate
  • - News + News From 51306678aa0a29111f62641214e4af6bdc8ed96a Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Tue, 29 Sep 2026 09:23:49 +1000 Subject: [PATCH 5/6] activity: mark /activity/ as not a menu item (it's reached from News) Co-Authored-By: Claude Opus 5.5 --- pages/activity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/activity.md b/pages/activity.md index 37862601..bc868ccb 100644 --- a/pages/activity.md +++ b/pages/activity.md @@ -2,7 +2,7 @@ title: Activity layout: activity permalink: /activity/ -menu_item: true +menu_item: false # The reporter's posts lived in _posts/ until the News/Activity split; keep their URLs working. redirect_from: - /2026/06/14/lectures.html From 56ae176dc119598ba9c11b5462d023f47e1380ad Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Tue, 29 Sep 2026 10:14:03 +1000 Subject: [PATCH 6/6] README: Activity updates arrive daily and merge once the data check passes Co-Authored-By: Claude Opus 5.5 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 400cd35f..1f60ff8f 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The site has two streams of updates. The rule of thumb: **people write News, the |---|---|---| | **What goes in** | New projects (a new lecture series, book, a library's first public release, or a new language edition of a lecture series), grants and funding, people (RAs, team changes, open positions), workshops, tutorials and talks, partnerships, and changes that affect users | Every library release; changes to existing lecture series (new lectures, new sections and exercises, substantive revisions, fixes a reader would notice); updates to translated editions | | **Written by** | A person | The reporter bot (maintained in the private `QuantEcon/reports-activity` repository) | -| **Review** | Normal PR review of the wording | A light check of the reporter's PR | +| **Review** | Normal PR review of the wording | None day to day: the reporter's daily PR merges itself once the data check passes (planned; until then, a light check of each PR) | **Excluded from both:** dependency and action version bumps, CI, build, deploy and publishing-workflow changes, analytics, editor-of-record and other metadata changes, translation-sync tooling, and website changes. Releases of tooling (GitHub Actions, themes, plugins) are not library releases, and a GitHub release published later for an old version is not a new release.