Skip to content

Releases: conanxin/artvee-gallery

Artvee Gallery v0.2.0

Choose a tag to compare

@conanxin conanxin released this 15 Jun 22:58

Release Notes · v0.2.0 (stable)

v0.2.0 is the first stable daily-operable release of
Artvee Gallery. It is identical in surface area to
v0.2.0-alpha (2026-06-13) and adds only the post-observation
hardening: a 3-day observation window, a Pages publish guard,
a fix for the daily health script's online-check signal
distortion, and the explicit "stable" tag.
See docs/RELEASE_NOTES_v0.2.0-alpha.md
for the full feature list and docs/STABLE_READINESS_v0.2.0.md
for the 15 / 15 readiness checklist that gates this release.

1. Summary

v0.2.0 is the first release of Artvee Gallery that has been
observed running unattended on a single host for 3 consecutive
days (2026-06-14 → 2026-06-16) without manual intervention, with
the daily health cron, the Telegram text + MEDIA delivery, and
both public demos all green at the end of the window. Everything
that was true of v0.2.0-alpha is still true of v0.2.0; what
changed in between is documented under
§ 6 "Upgrade notes from v0.2.0-alpha"
below.

The system is designed to be safe to run unattended: nothing
destructive is automatic, the publish step is always manual
(--approve is required), and the data surface is
machine-checked at every push by check_open_source_ready.py.

2. Stable readiness

Gate Result Evidence
3-day observation window PASS docs/V0_2_OBSERVATION_WINDOW.md
Day 1 (2026-06-14) Green reports/runtime/daily-health/artvee-daily-health-2026-06-14.md
Day 2 (2026-06-15) Green (post-restore, with incident annotation) reports/runtime/daily-health/artvee-daily-health-2026-06-15.md, docs/PROJECT_STATUS.md (P7E+1, P7E+2)
Day 3 (2026-06-16) Green reports/runtime/daily-health/artvee-daily-health-2026-06-16.md
Daily health cron Installed, ran 03:00 daily logs/daily-health-cron/daily_health_*.log
Telegram text Delivered every day message_ids 22919, 23150, 23707
Telegram MEDIA Delivered every day message_ids 22921, 23151, 23709
Public Gallery Demo 6/6 endpoints HTTP 200 live curl -I 2026-06-16 06:38
Public Daily Digest 6/6 endpoints HTTP 200 live curl -I 2026-06-16 06:38
KNOWN_RETIRED 4 (audited, not blocking) reports/runtime/p6b-known-retired-urls.json
blocking_unresolved 0 reports/runtime/artvee-status-report.md
Strict integrity PASS scripts/check_gallery_integrity.py --strict
Readiness CI PASS (4/4) scripts/check_open_source_ready.py
Readiness checklist 15 / 15 PASS docs/STABLE_READINESS_v0.2.0.md §6

3. Public demos

Neither export contains the full local archive, the original
image assets, or any private metadata. The Pages publish guard
(P7E+2 follow-up, cross-repo) prevents the public GitHub Pages
repo from accidentally clobbering these subtrees during other
workstream publishes.

4. Key capabilities

Local-first gallery

  • Local gallery browser (P1) with thumbnails at 256 / 512 px and
    a search / filter / detail-modal UI shell.
  • Strict integrity gate (P4A+1, P4B) that fails the build on
    duplicate ids, duplicate basenames, or one-id-many-URL
    anomalies.
  • KNOWN_RETIRED-aware status report (P6G) that distinguishes
    audited retirees from blocking unresolved losers.

Daily inspiration digest

  • Deterministic 30-day digest history (P6F) with
    near-duplicate-aware selection.
  • Public Daily Digest page (P3E, P6F+1) on a separate GitHub
    Pages surface.

Public demo publishing

  • Approved-publish helper
    (scripts/publish_demo_refresh_candidate.sh --approve) that
    pre-stages the GitHub Pages bundle and waits the 90-second
    CDN warm-up window.
  • No auto-publish: the helper refuses to run without --approve.

Operations

  • Daily health check (P7A) with a JSON report that distinguishes
    integrity, readiness, candidate state, digest history, and
    near-dup cluster counts, plus a 6-endpoint online probe.
  • Daily health Telegram cron at 03:00 Asia/Shanghai (P7B).
  • Failure-only fallback (P7B+1): when health is PASS but MEDIA
    delivery failed, a short text-only warning is sent.
  • Signal-distortion fix in artvee_daily_health_check.py
    (P7E+2): the online probe now distinguishes HTTPError
    (real HTTP code) from URLError (network error), so a
    future Pages content drift is reported correctly within
    24 h instead of masked as 0, 0.
  • Open-source readiness CI (P3C, P3D) that fails the build on
    path leaks, real secrets, tracked runtime files, or files

    1 MB.

5. Operational state at release time

Metric Value
records 835
known_retired 4 (audited, not blocking)
blocking_unresolved 0
strict integrity PASS
readiness PASS (4/4)
public_demo_ready true
digest_ready true
latest nightly batch 2026-06-16 02:00 — 20 selected, 0 failed
digest history entries 5
near-dup clusters 8 (23 records)
online gallery 200 (all 3 endpoints)
online digest 200 (all 3 endpoints)
Telegram text sent (message_id 23707)
Telegram MEDIA sent (message_id 23709)

Daily cron rhythm

Time (Asia/Shanghai) What runs Log
01:30 artvee_nightly_wrapper.sh refill logs/wrapper_refill.log
02:00 artvee_nightly_wrapper.sh batch logs/wrapper_batch.log
02:30 confirm_demo_refresh.sh --no-telegram logs/confirm_demo_refresh/cron_stderr.log
03:00 artvee_daily_health_check.sh --online --media logs/daily-health-cron/daily_health_YYYYMMDD_030000.log
manual publish_demo_refresh_candidate.sh --approve (no auto-run)

Refill and nightly batch are the only cron jobs that touch the
network; everything else is local. Publish to GitHub Pages is
always a manual --approve step, never a cron step.

6. Upgrade notes from v0.2.0-alpha

There is no in-place migration path, because the data
surface (images / metadata / thumbs / web/data) is intentionally
not tracked. The repo is regenerated from a working data
directory on the maintainer's local host and then pushed.
Forks or fresh clones should:

  1. Clone the repo.
  2. Populate their own images/, metadata/, and index/
    directories (any data source that conforms to the
    web/data/artworks.json schema in
    docs/GALLERY_PUBLIC_USAGE.md
    see also docs/GALLERY_DATA_SCHEMA.md).
  3. Run the daily wrapper, then confirm_demo_refresh.sh, then
    the public-demo export, then (optionally) the manual
    publish_demo_refresh_candidate.sh --approve.

What changed in the tracked code between v0.2.0-alpha and v0.2.0:

Change Why Files
artvee_daily_health_check.py — split except Exception into HTTPError / URLError / TimeoutError / ConnectionError; new online.kind, online.gallery_error, online.digest_error; recommended_action branches by kind During Day 2 the health script masked real HTTP 404s as 0, 0. After this fix a future Pages content drift is reported with the correct code. scripts/artvee_daily_health_check.py (only)
New docs/STABLE_READINESS_v0.2.0.md Documents the 15 / 15 readiness criteria that gate this release. docs/STABLE_READINESS_v0.2.0.md (new)
New docs/V0_2_OBSERVATION_WINDOW.md Day 3 log Closes the 3-day observation window. docs/V0_2_OBSERVATION_WINDOW.md
New docs/RELEASE_NOTES_v0.2.0.md (this file) The stable release notes. docs/RELEASE_NOTES_v0.2.0.md (new)
CHANGELOG.md — v0.2.0 section added Records the post-alpha hardening. CHANGELOG.md
README.md — Latest release bumped from v0.2.0-alpha to v0.2.0 Surfaces the new release. README.md
docs/PROJECT_STATUS.mdP7E+3 closed, P7F row added, v0.2.0 stable release row added Phase markers and release snapshot. docs/PROJECT_STATUS.md
docs/ROADMAP.mdP7F moved to completed, v0.2.0 stable moved to completed, next: P8 / content product polish Roadmap updated. docs/ROADMAP.md

Cross-repo follow-up (in the shared Pages repo, not in this
artvee repo):
the new scripts/check-project-publish-guard.py

  • docs/PAGES_PUBLISH_GUARD.md shipped in the Pages repo so
    that future WBW SpaceX Mars publish runs cannot silently
    clobber the projects/artvee-gallery-* subtrees. The artvee
    repo itself is not affected.

7. Safety boundaries

The same boundaries documented in
docs/OPEN_SOURCE_BOUNDARIES.md and
the v0.2.0-alpha release notes still apply. Quick recap:

  • No network is opened by the readiness check, the syntax
    checks, or the daily health cron offline modes.
    The
    --online flag adds an HTTP HEAD-style probe; no auth, no
    cookies.
  • No GitHub Pages push is automatic. The publish helper
    refuses to run without --approve and writes its bundle to
    dist/ for inspection first.
  • No tokens, chat ids, or bot tokens are tracked. The
    Telegram notifier resolves the chat id from the
    ARTVEE_TELEGRAM_CHAT_ID env var, then from the OpenClaw
    config; resolution is hard-fail if neither is set.
  • MEDIA delivery failure is non-fatal. A failure-only
    fallback sends a short text-only warning when health is
    PASS but the Markdown attachment was rejected.
  • No destructive commands run unattended. trash is
    preferred over rm in dev scripts; the cron jobs are
    append-only by construction.
  • No runtime data is tracked. images/, metadata/,
    thumbs/, dist/, digests/, logs/, inbox/,
    web/data/*.json (except .gitkeep), index/,
    reports/runtime/, and tmp/ are git...
Read more

Artvee Gallery v0.2.0-alpha

Choose a tag to compare

@conanxin conanxin released this 12 Jun 20:58

Release Notes · v0.2.0-alpha

v0.2.0-alpha turns Artvee Gallery from an open-source local
gallery builder (v0.1.0-alpha) into a daily-operable local-first
visual archive system with public demos, curated daily digests,
status reporting, and Telegram health delivery.

1. Summary

This release consolidates P3D through P7B+1: a public GitHub
repository with a running CI gate, a public daily-digest page, a
content-healing pipeline, visual QA, near-duplicate review, a
30-day digest history, an approved-publish helper, a daily health
check, and a cron-installed Telegram delivery with MEDIA staging
and a failure-only fallback. The system is designed to be safe to
run unattended on a single host: nothing destructive is automatic,
the publish step is always manual, and the data surface is
machine-checked at every push.

2. Highlights

Public surfaces (live)

Local capabilities

  • Local-first gallery browser (P1) with thumbnails at 256 / 512 px
    and a search / filter / detail-modal UI shell.
  • Daily inspiration digest with deterministic 30-day history and
    near-duplicate-aware selection (P3B, P6F).
  • Filename collision healing (P4B) and audited KNOWN_RETIRED
    handling for sources the upstream archive has removed (P6B,
    P6G).
  • Visual QA contact sheets and curation filters (P5D, P5E).
  • Near-duplicate review workflow with contact sheets and an
    audit trail (P6C).
  • Approved-publish helper (P6F+1) that pre-stages the GitHub
    Pages bundle and waits the 90-second CDN warm-up window.

Operations

  • Daily health check (P7A) with a JSON report that distinguishes
    integrity, readiness, candidate state, digest history, and
    near-dup cluster counts.
  • Open-source readiness CI (P3C, P3D) that fails the build on
    path leaks, real secrets, tracked runtime files, or files

    1 MB.

  • Daily health Telegram cron at 03:00 Asia/Shanghai (P7B) with
    a failure-only fallback (P7B+1): when MEDIA delivery fails but
    health is PASS, a short text-only warning is sent.
  • Idempotent, marker-based cron installer (P7B) that bakes
    PATH and the chat id env into the cron line so OpenClaw
    resolves from the cron env.

3. Operational state at release time

Metric Value
records 776
known_retired 4 (audited, not blocking)
blocking_unresolved 0
strict integrity PASS
public demo ready true
digest ready true
latest nightly 2026-06-13 02:00 — 20 selected, 0 failed

4. Daily cron rhythm

Time (Asia/Shanghai) What runs Log
01:30 artvee_nightly_wrapper.sh refill logs/wrapper_refill.log
02:00 artvee_nightly_wrapper.sh batch logs/wrapper_batch.log
02:30 confirm_demo_refresh.sh --no-telegram logs/confirm_demo_refresh/cron_stderr.log
03:00 artvee_daily_health_check.sh --online --media logs/daily-health-cron/daily_health_YYYYMMDD_030000.log
manual publish_demo_refresh_candidate.sh --approve (no auto-run)

Refill and nightly batch are the only cron jobs that touch the
network; everything else is local. Publish to GitHub Pages is
always a manual --approve step, never a cron step.

5. What is included vs. not included

Included

  • Source code under scripts/, web/, examples/, data/ (small).
  • Documentation under docs/.
  • CI workflow under .github/workflows/.
  • .gitignore, LICENSE (MIT), README.md, CHANGELOG.md.

Not included (by design)

  • images/ — full original image archive (large; regenerable).
  • metadata/ — full scraped metadata (large; regenerable).
  • thumbs/{256,512}/ — generated thumbnails (regenerable).
  • dist/ — exported public bundles (regenerable).
  • digests/ — generated daily digest corpus (regenerable).
  • logs/ — runtime logs (regenerable; deliberately not
    committed for privacy).
  • reports/runtime/ — runtime status and contact sheets
    (regenerable).
  • web/data/*.json (except .gitkeep placeholders) — generated
    gallery / digest / stats JSON.
  • Local machine paths, tokens, chat ids, or bot tokens.

The readiness CI enforces this boundary on every push; a
violation fails the build. See
docs/OPEN_SOURCE_BOUNDARIES.md.

6. Upgrade notes from v0.1.0-alpha

There is no in-place migration path because v0.1.0-alpha did
not include a corpus. The repo is regenerated from a working
data directory on the maintainer's local host and then pushed.
Forks should:

  1. Clone the repo.
  2. Populate their own images/, metadata/, and index/
    directories (any data source that conforms to the
    data/artworks.json schema in
    docs/GALLERY_PUBLIC_USAGE.md).
  3. Run the daily wrapper, then confirm_demo_refresh.sh, then
    the public-demo export, then (optionally) the manual
    publish_demo_refresh_candidate.sh --approve.

The new wrapper path-agnosticism from v0.1.0-alpha still
applies; nothing in this release adds machine-specific paths
back into the tracked code.

7. Safety model

  • No network is opened by the readiness check, the syntax
    checks, or the daily health cron.
    The cron uses --online
    to check the public demo and digest URLs, but only via HTTP
    HEAD-style probes — no auth, no cookies.
  • No GitHub Pages push is automatic. The publish helper
    refuses to run without --approve and writes its bundle to
    dist/ for inspection first.
  • No tokens, chat ids, or bot tokens are tracked. The
    Telegram notifier resolves the chat id from the
    ARTVEE_TELEGRAM_CHAT_ID env var, then from the OpenClaw
    config; resolution is hard-fail if neither is set.
  • MEDIA delivery failure is non-fatal. A failure-only
    fallback sends a short text-only warning when health is
    PASS but the Markdown attachment was rejected.
  • No destructive commands run unattended. trash is
    preferred over rm in dev scripts; the cron jobs are
    append-only by construction.

8. Known limitations

  • The Telegram notifier depends on a local OpenClaw CLI as the
    message bridge. Users without that bridge can simply skip
    the notify step (the wrapper isolates it with || true).
  • The repo does not include a corpus. To exercise the
    local UI shell, the user must populate images/,
    metadata/, and index/ locally.
  • The status report uses KNOWN_RETIRED to mark the four
    source URLs that have been removed from the upstream
    archive. They are audited, not blocking, and they are
    listed in data/p6b-known-retired-urls.json for
    transparency.
  • The --simulate-media-failure flag on the daily health
    check is a testing-only convenience. It is not used
    in cron.

9. Next steps

  • v0.2.0 observation window — let the cron run for a few
    days and watch for any MEDIA delivery regressions, with the
    failure-only fallback as the safety net.
  • P8 automation polish — small follow-ups: a pre-flight
    --dry-run mode on the publish helper, a 02:55 pre-check
    cron that runs the daily check in --no-telegram mode and
    alerts only on FAIL, and a small CI matrix that exercises
    the cron installer in a container.
  • v0.2.0 stable — after the observation window, cut a
    stable release with the KNOWN_RETIRED table moved into
    the public demo's UI.

See docs/ROADMAP.md for the long-term
direction.

10. Acknowledgements

  • Data source: artvee.com public-domain
    art archive.
  • The local-first / open-source boundary pattern is inspired
    by the standard "thin shell, fat scripts" approach for data
    tooling.
  • The Telegram delivery state model is the project-private
    "thin harness, fat skills" approach: each delivery track
    reports its own attempted / sent / message_id /
    error, so partial failures stay observable.

Artvee Gallery v0.1.0-alpha

Choose a tag to compare

@conanxin conanxin released this 11 Jun 23:38

Release Notes · v0.1.0-alpha

The first open-source-facing release. The repository is now
self-describing, has a single canonical ignore file, a privacy
surface that is machine-checked, and a public MIT license.

1. What is in this release

Documentation

  • README.md rewritten as a self-contained entry point with a
    live demo link, a "what is and is not included" section, an
    architecture diagram, a quick-start section, and a docs index.
  • docs/ARCHITECTURE.md — end-to-end data flow, per-script
    responsibilities, generated-vs-tracked boundary, nightly
    wrapper post-batch flow, public demo flow.
  • docs/OPEN_SOURCE_BOUNDARIES.md — what ships in the repo, what
    does not, why the public demo is safe, the risk surface that
    is checked at release time, and a migration note for forks.
  • docs/ROADMAP.md — past phases (P1, P2, P3A, P3B, P3C, E2E
    cron verification), near-term (P3D, P3E), mid-term, long-term.
  • docs/DEVELOPMENT.md — local dev loop, syntax checks, the
    smoke flow, what not to run in dev, the readiness check,
    branch model, pre-commit checklist.
  • docs/PROJECT_STATUS.md — current phase markers and the
    last-known-good nightly snapshot.
  • docs/RELEASE_NOTES_v0.1.0-alpha.md — this file.
  • Existing docs/GALLERY_*.md files retained for deep dives into
    data schema, local usage, public demo, and digest builder.

License

  • LICENSE — MIT, full standard text.

Sample data

  • examples/artworks.sample.json — 3 synthetic records.
  • examples/gallery_stats.sample.json — minimal stats object.
  • examples/digest.sample.json — minimal digest index entry.

All sample paths are relative (./assets/thumbs/...) and reference
non-existent files; the samples are shape references, not usable
artworks.

Repo hygiene

  • .gitignore consolidated; placeholders (.gitkeep) preserved for
    the empty dist/, digests/, thumbs/{256,512}/, web/data/
    directories.
  • The legacy .gitignore.local (identical content, outdated
    comment) was removed.

Wrapper path-agnosticism

  • scripts/artvee_nightly_wrapper.sh now derives BASE_DIR from
    its own location via $(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd),
    replacing the previous hardcoded $HOME/... paths.
  • PYTHON defaults to python3 from PATH; can be overridden by
    ARTVEE_PYTHON environment variable.

Safety check

  • scripts/check_open_source_ready.py — a pure-stdlib,
    read-only, exit-coded check that fails the build on:
    • tracked files in gitignored directories,
    • path leaks (absolute home path, user-home shorthand, workspace-name substring) in non-source text files,
    • real-looking secrets (password = "...", token = "...",
      secret = "..."),
    • tracked files > 1 MB.

2. Verification status

Check Result
py_compile on all shipped scripts
bash -n on shipped shell scripts
python3 scripts/check_open_source_ready.py ✅ PASS
git ls-files against gitignore surface ✅ no generated data tracked
Public demo live at https://conanxin.github.io/projects/artvee-gallery-demo/
Nightly cron auto-run (2026-06-12 02:00) ✅ PASS
Last-known-good nightly snapshot 760 downloaded, 0 failed, 530 pending

The most recent nightly verification report lives at
<workspace>/reports/artvee-nightly-auto-run-verification-2026-06-12.md
in the maintainer's local workspace; it is intentionally not
committed to this repository.

3. Limitations

  • The repository does not include a corpus. To exercise the
    local UI shell, the user must populate images/, metadata/,
    and index/ locally. This is by design — see
    docs/OPEN_SOURCE_BOUNDARIES.md.
  • The Telegram notifier depends on a local OpenClaw CLI as the
    message bridge. Users without that bridge can simply skip the
    notify step (the wrapper isolates it with || true).
  • Source-code privacy is verified by code review and the readiness
    check; it is not enforced by .gitignore (which is correct:
    source files are tracked).
  • The sample data uses fictitious IDs and categories; it is not
    a working subset of any real archive.

4. Next steps

See docs/ROADMAP.md § "Near-term":

  • P3D — Standalone public GitHub repository: initialise, push
    only the open-source surface area, configure branch protection
    and a CI job that runs check_open_source_ready.py on every PR.
  • P3E — Public daily-digest page, alongside the existing
    public gallery demo.

5. Acknowledgements

  • Data source: artvee.com public-domain art
    archive.
  • The local-first / open-source boundary pattern is inspired by
    the standard "thin shell, fat scripts" approach for data tooling.