Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,7 @@
- [ ] ES / EN / FR kept in lock-step (`.md` + `.en.md` + `.fr.md`, or the `es:` / `en:` / `fr:` columns)
- [ ] `bundle exec jekyll build` passes locally (or the **Build site** check is green)
- [ ] New external links verified to open the intended page
- [ ] English text, code, comments and names use American English (see AGENTS.md)
- [ ] No e-mail addresses and no new links into `cnet.fi.uba.ar`
- [ ] New publications carry `topics = {…}` from `_data/publication_topics.yml`
- [ ] Screenshots attached for visual changes
5 changes: 5 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ updates:
directory: "/"
schedule:
interval: monthly
ignore:
# Pinned to 2.x on purpose: the academicpages partials do not compile under
# dart-sass (jekyll-sass-converter 3.x). See the Gemfile and AGENTS.md.
- dependency-name: jekyll-sass-converter
update-types: ["version-update:semver-major"]
groups:
jekyll:
patterns: ["*"]
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@ jobs:
ruby-version: "3.3"
bundler-cache: true

- name: Check publication topic ids
run: |
# Every id in a `topics = {...}` field must exist in
# _data/publication_topics.yml; an unknown id renders no chip silently.
known=$(sed -n 's/^- id: *//p' _data/publication_topics.yml | sort -u)
used=$(grep -oE '^[[:space:]]*topics[[:space:]]*=[[:space:]]*\{[^}]*\}' _bibliography/conexdat.bib \
| sed -E 's/.*\{(.*)\}/\1/' | tr ',' '\n' | tr -d ' ' | sed '/^$/d' | sort -u)
unknown=$(comm -13 <(echo "$known") <(echo "$used"))
if [ -n "$unknown" ]; then
echo "::error::Unknown publication topic id(s): $unknown"; exit 1
fi
echo "OK: $(echo "$used" | wc -l) topic ids used, all known"

- name: Build site (Jekyll + polyglot + scholar)
env:
JEKYLL_ENV: production
Expand All @@ -40,4 +53,16 @@ jobs:
grep -q 'href="/en/" title="English"' _site/index.html
grep -q 'href="/" title="Español"' _site/en/index.html
grep -q 'href="/fr/" title="Français"' _site/en/index.html
# Publication topics: chips in the bar, and space-separated ids on
# entries (the filter splits on whitespace).
grep -q 'data-topic="latam"' _site/publications/index.html
grep -Eq 'data-topics="[a-z-]+ +[a-z-]+' _site/en/publications/index.html
# Group decision: no e-mail addresses anywhere on the site.
if grep -rl 'mailto:' _site --include='*.html'; then
echo "::error::mailto: link found (the site publishes no e-mail addresses)"; exit 1
fi
# Repository docs must not be published with the site.
for f in AGENTS.md CLAUDE.md CONTRIBUTING.md CODE_OF_CONDUCT.md SECURITY.md; do
test ! -e "_site/$f"
done
echo "OK: $(find _site -name '*.html' | wc -l) HTML files"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ Gemfile.lock
*~
node_modules/


# Claude Code subagent worktrees
.claude/worktrees/
120 changes: 120 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# AGENTS.md — CoNexDat website

Instructions for AI coding agents (Claude Code, Copilot, Codex, Cursor, ...) working in
this repository. `CLAUDE.md` includes this file. Humans: see `CONTRIBUTING.md`.

## What this project is

The public website of CoNexDat, the Complex Networks and Data Communication Group at
the School of Engineering of the University of Buenos Aires (FIUBA), directed by
J. Ignacio Alvarez-Hamelin. It is a static Jekyll 4 site built on the academicpages
template, trilingual (Spanish default, English, French) through jekyll-polyglot, with
publications rendered from BibTeX by jekyll-scholar. GitHub Actions builds it and
publishes `_site/` to the `gh-pages` branch, served at <https://conexdat.github.io>.
It replaces the legacy site at `cnet.fi.uba.ar`, which is being retired.

## Layout

```
_config.yml site, polyglot and scholar settings; cnet.highlighted_authors
_config.dev.yml local overrides (url: http://localhost:4000); required for previews
_pages/<page>.md Spanish page; <page>.en.md and <page>.fr.md are the translations
_data/
members.yml people, by category (current, external, former-inhouse, ...)
projects.yml funded projects
research_areas.yml research areas: home cards + /research/<slug>/ pages
highlights.yml home-page project cards
publication_topics.yml publication topics (labels), trilingual
theses.yml, navigation.yml, ui-text.yml
_news/ one file per news item and language (inline, no pages)
_bibliography/conexdat.bib THE publication list (other .bib files are unused sources)
_layouts/bib_entry.html how one publication renders (buttons, highlighting, topic chips)
_includes/ masthead (language switcher), people/projects/theses lists,
publications-filter.html, research-area.html
assets/js/publications.js search / topic / person filter on /publications/
_sass/_conexdat.scss all site-specific styles (colors, cards, chips, dark mode)
.github/workflows/ build.yml (PR check "Build site"), deploy.yml (push to main)
```

## Commands

```bash
export PATH="/usr/local/opt/ruby@3.3/bin:$PATH" # macOS/Homebrew; Ruby 3.3 only
bundle install
bundle exec jekyll serve --livereload --config _config.yml,_config.dev.yml # preview
JEKYLL_ENV=production bundle exec jekyll build # what CI runs
```

Ruby 3.3 is required: the system Ruby is too old for Bundler 4, and Ruby 4 cannot
compile the `sassc` native gem. A full build takes about 30 seconds. The repeated
"Error reading file _layouts/single" warnings are a harmless polyglot quirk. To preview
a finished build without Jekyll, serve `_site/` on **port 4000**; the dev config
hard-codes that origin for CSS and assets.

## Conventions

- **American English everywhere** (mandatory) for English text: the `.en.md` pages, the
`en:` values in `_data/`, English news, this file, README, CONTRIBUTING, commit
messages, PR descriptions, and every code comment, identifier, CSS class and
JavaScript name (`color`, `gray`, `center`, `behavior`, `modeling`, `analyze`,
`visualize`, `normalize`, `organization`, `toward`, `inquiry`). Spanish and French
content stays in correct Spanish and French. Exceptions: proper names and published
paper titles in the bibliography are kept exactly as published.
- **Three languages in lock-step.** Every content change updates Spanish, English and
French together: the three `.md` files of a page, or the `es:` / `en:` / `fr:` keys of
the same YAML entry. Never ship a page or entry in one language only.
- **No e-mail addresses anywhere on the site** (group decision, September 2026). The
contact page points to the director and to <https://github.com/CoNexDat>. Do not add
`mailto:` links, and keep `author.email` in `_config.yml` empty.
- **Do not link into `cnet.fi.uba.ar`.** Unknown paths there silently serve the legacy
home page, so a link can look alive and still be wrong. Pages that still exist there
and may be linked: `netscix23/`, `SnailVis/`, `PIT/…`, `PaD/`. Otherwise use the
project's new home (TiX: <https://github.com/TiX-measurements>, LaNet-vi:
<https://github.com/CoNexDat/LaNet-vi>, TMA2018: <https://netcores.fi.uba.ar/>) or a
Wayback Machine snapshot. Check with `grep -rn cnet.fi.uba.ar _data _pages _news`.
- **Verify every new external link** with `curl -sIL` and read where it lands: a 200 on
a home page, a sign-in wall or a parked domain is a broken link.
- **Publications**: add entries to `_bibliography/conexdat.bib` with a
`topics = {id1, id2}` field using ids from `_data/publication_topics.yml` (add a new
topic there, in three languages, only when no existing one fits). Two 1990s
instrumentation papers (`onditas96`, `Thermog95`) are deliberately untagged: no topic
fits them, and they only disappear while a topic filter is active. Prefer a bare DOI
(`10.xxxx/…`), `eprint` + `archiveprefix = {arXiv}` for preprints, and check the key is
not already present: the group's own exports contain duplicates.
- Internal links are written without language prefix (`/projects/`); polyglot adds
`/en/` or `/fr/`. Do not hard-code `https://conexdat.github.io/...` in content.
- Commit messages and PR descriptions in American English, imperative subject line.

## Things that are easy to get wrong

- **Language switcher.** Polyglot rewrites every `href="/…"` on EN and FR pages into the
current language, which breaks hand-written ES | EN | FR links. The masthead writes them
as `ferh="/en/…"`, which polyglot turns back into `href` untouched. Do not rename the
attribute. The `Build site` workflow greps the output for the expected hrefs.
- **No `//` comments inside inline `<script>` blocks.** Production builds compress HTML
onto one line, so a `//` comment swallows the rest of the script. That silently broke
the previous language switcher. Use `/* … */` or move the code to `assets/js/`.
- `assets/js/main.min.js` is a prebuilt file; `assets/js/_main.js` and `plugins/` are
excluded from the build, so editing them changes nothing.
- `jekyll-sass-converter` is pinned to 2.x on purpose: the academicpages partials do not
compile under dart-sass (3.x). Dependabot is told to ignore that major version.
- Jekyll-scholar exposes custom BibTeX fields (`topics`, `pdf`, `code`, ...) to
`_layouts/bib_entry.html`; the same template renders the short paper lists on research
area pages, so keep it free of page-specific assumptions.

## Pull request workflow (required)

`main` is protected by the "Protect main" ruleset: no direct pushes, no force-push or
deletion, pull request required, and the `Build site` check must pass. Repository
admins can bypass; do not use the bypass unless a maintainer explicitly asks for it in
an emergency, and say so in the PR description.

1. Branch from `main` (`feat/…`, `fix/…`, `content/…`, `docs/…`, `chore/…`), commit,
push, open the PR with `gh pr create`, and fill the PR template checklist honestly.
2. Build locally before pushing. For visual changes, check ES, EN and FR in the browser,
in light and dark mode, and at phone width.
3. Wait for `Build site`. If it is red, read the log (`gh run view <id> --log-failed`),
fix, push, and wait again. Never weaken the check to get green.
4. Get a review before merging (see CLAUDE.md for how Claude Code sessions do this).
5. Merge with `gh pr merge <n> --squash --delete-branch`. Merging deploys to production
within a few minutes; confirm the live page afterwards.
26 changes: 26 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
@AGENTS.md

## Claude Code way of working

Every PR is reviewed by a **fresh-context reviewer subagent** before merging:

1. Push the branch, open the PR, and wait for the `Build site` check.
2. Spawn a **new** reviewer with the Agent tool: `model: "sonnet"`,
`isolation: "worktree"`, and a self-contained prompt with the repository, the PR
number, `gh pr diff <n>`, the conventions in AGENTS.md, the checks to run (the
production build with Ruby 3.3, link checks with `curl -sIL` on every added URL, a
British-spelling scan of English text), "read-only, do not modify the repository",
and the required output: findings ranked by severity with `file:line`, a concrete
failing scenario and a suggested fix, ending with exactly `VERDICT: APPROVE` or
`VERDICT: CHANGES REQUESTED`.
3. Verify each finding before acting on it. Fix it (commit and push) or record in a PR
comment why it does not apply.
4. After any change, spawn **another fresh** reviewer for the new state; never continue
the previous reviewer session.
5. Merge only when the check is green on the latest push **and** the latest reviewer
says `VERDICT: APPROVE`. Post a PR comment summarizing the review rounds, then merge
with `gh pr merge <n> --squash --delete-branch` and confirm the live site.

The site belongs to the group director, J. Ignacio Alvarez-Hamelin, and is maintained by
Esteban Carisimo. Feedback from the director usually arrives as a list in Spanish; treat
each item as a separate, verifiable fix.
31 changes: 25 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ public face of the group, so small, well-scoped changes are preferred.
three languages in lock-step: either edit the `es:` / `en:` / `fr:` columns
of the same YAML entry, or edit the `.md`, `.en.md` and `.fr.md` page
together.
- English text uses **American English** (US spelling: `color`, `behavior`,
`modeling`, `visualize`, `toward`), and so do code comments and names. Spanish
and French stay in correct Spanish and French. Published paper titles are kept
as published.
- The site publishes **no e-mail addresses**. The contact page points to the group
director and to the [CoNexDat GitHub organization](https://github.com/CoNexDat).
- Do not link into the legacy `cnet.fi.uba.ar` server: unknown paths there quietly
serve its old home page. See AGENTS.md for the few pages that still exist.
- Be kind: see [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).

## What goes where
Expand All @@ -21,7 +29,8 @@ public face of the group, so small, well-scoped changes are preferred.
|------------------------------------|----------------------------------------|
| Add / update a member | `_data/members.yml` |
| Add a news item | `_news/YYYY-MM-DD-slug.md` (+ `.en.md`, `.fr.md`) |
| Add a publication | `_bibliography/conexdat.bib` |
| Add a publication | `_bibliography/conexdat.bib` (+ `topics`) |
| Add / rename a publication topic | `_data/publication_topics.yml` |
| Add / update a funded project | `_data/projects.yml` |
| Change a home-page project card | `_data/highlights.yml` |
| Change a research area | `_data/research_areas.yml` |
Expand All @@ -34,13 +43,23 @@ partials render them. Do not hand-edit anything under `_site/`.

### Publications

Drop a BibTeX entry into `_bibliography/conexdat.bib`. Useful optional fields
that the entry template understands: `abstract`, `doi`, `eprint` +
`archiveprefix = {arXiv}`, `pdf` (file under `assets/pdf/` or a URL), `code`,
`slides`, `poster`, `website`, `bibtex_show = {true}`.
Drop a BibTeX entry into `_bibliography/conexdat.bib` and tag it with one or
more topics, using the ids listed in `_data/publication_topics.yml`:

```bibtex
topics = {internet-measurement, latam}
```

Topics appear as chips above the list and on every entry, and filter the list
when clicked (deep link: `/publications/#topic=latam`). Add a new topic to the
YAML file, in all three languages, only when no existing one fits.

Other optional fields that the entry template understands: `abstract`, `doi`,
`eprint` + `archiveprefix = {arXiv}`, `pdf` (file under `assets/pdf/` or a
URL), `code`, `slides`, `poster`, `website`, `bibtex_show = {true}`.

Author surnames listed under `cnet.highlighted_authors` in `_config.yml` are
emphasised automatically.
emphasized automatically.

### Members

Expand Down
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ source 'https://rubygems.org'
gem 'jekyll', '~> 4.3'

# Pin jekyll-sass-converter to 2.x — academicpages' Sass partials rely on
# the older libsass/sassc behaviour, and dart-sass (jekyll-sass-converter
# the older libsass/sassc behavior, and dart-sass (jekyll-sass-converter
# 3.x) raises "Can't find stylesheet to import" on the same files.
gem 'jekyll-sass-converter', '~> 2.0'

Expand Down
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ Open <http://localhost:4000/>, <http://localhost:4000/en/>,
- `_data/projects.yml` — research projects, trilingual
- `_data/news.yml`, `_data/highlights.yml` — home-page panels
- `_data/navigation.yml` — top nav with localized labels
- `_bibliography/*.bib` — publications (rendered by jekyll-scholar)
- `_bibliography/conexdat.bib` — publications (rendered by jekyll-scholar),
each tagged with `topics = {…}`
- `_data/publication_topics.yml` — trilingual publication topics (labels)
- `_includes/people-list.html`, `projects-list.html` — shared layouts
- `_includes/publications-filter.html` + `assets/js/publications.js` — search /
filter-by-person bar on `/publications/`
- `_includes/publications-filter.html` + `assets/js/publications.js` — search,
topic and person filters on `/publications/`
- `_includes/masthead.html`, `head.html` — overridden for i18n + favicon
- `images/` — logo, favicon, profile picture

Expand All @@ -60,6 +62,9 @@ does not whitelist `jekyll-polyglot` or `jekyll-scholar`.
requests, the **Build site** check (`.github/workflows/build.yml`) must pass,
and force-pushes / deletion are blocked. Repository admins can bypass in an
emergency.
- Coding agents (and humans who want the details) read [AGENTS.md](AGENTS.md):
American English, the three-language rule, no e-mail addresses, no links into
the legacy server.
- See [CONTRIBUTING.md](CONTRIBUTING.md) for what-goes-where, the local
preview recipe and the PR checklist; [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)
and [SECURITY.md](SECURITY.md) for conduct and vulnerability reporting.
Expand Down
Loading
Loading