Manifes Penyematan Dependensi
Kebijakan deklarasi dependensi yang mencakup rentang runtime Python, perkakas pengembangan, berkas kunci perkakas rilis, dan batas bawah versi yang diratifikasi untuk setiap permukaan build.
Sikap yang diratifikasi tentang cara Apothem mendeklarasikan, menyematkan, dan mengunci dependensi. Audiens: kontributor dan konsumen hilir yang perlu memahami model reproduktibilitas.
Sikap
Apothem adalah CLI Python dengan kumpulan dependensi runtime yang kecil ditambah
rantai perkakas pengembangan, audit, rilis, dan dokumentasi yang lebih besar.
Dependensi runtime menggunakan batas bawah yang konservatif di pyproject.toml;
situs web meng-commit site/package-lock.json; GitHub Actions disematkan oleh
SHA yang tak dapat diubah dengan komentar versi dan ditingkatkan oleh Dependabot.
| Kelas | Deklarasi | Kebijakan penguncian |
|---|---|---|
| Dependensi runtime Python | [project.dependencies] di pyproject.toml | Rentang batas bawah untuk pengguna; tidak ada kunci runtime Python yang dikirim bersama paket. CI memasang penutupan dependensi tersebut yang dikunci hash (lihat Kunci dependensi CI) |
| Perkakas pengembangan / keamanan | extras [project.optional-dependencies] | Rentang batas bawah, kecuali ruff dan mypy, yang disematkan secara eksak oleh extra dev ke versi yang dijalankan CI (untuk ruff, lihat Kunci perkakas CI); CI memasang extra dev dari penutupan yang dikunci hash (lihat Kunci dependensi CI) |
| Perkakas rilis | scripts/release/requirements-build-linux.txt untuk alur kerja rilis; extra release di [project.optional-dependencies] untuk build lokal | Dikunci hash untuk alur kerja rilis; dihasilkan dari penutupan perkakas rilis. Extra release adalah rentang batas bawah |
| pip CI | scripts/ci/requirements-ci-pip.txt | Dikunci hash: satu penyematan pip==X.Y.Z beserta hash wheel dan sdist-nya, yang dipasang dengan --require-hashes -r oleh setiap alur kerja yang meningkatkan pip. Dependabot mengusulkan peningkatannya dan menulis ulang hash-nya; scripts/dev/check_pip_pin_drift.py menahan penyematan di pip 26.2 atau lebih baru |
| Kunci dependensi CI | scripts/ci/requirements-ci-dev.txt, -runtime.txt, -test.txt, dan -prereqs.txt | Penutupan universal yang dikunci hash, dikompilasi dengan uv pip compile dari pyproject.toml (atau, untuk -prereqs.txt, dari prasyarat host milik mesin) per tanggal penguncian dikurangi masa tunggu 7 hari, keduanya dicatat di setiap berkas, dan dipasang dengan --require-hashes -r (paketnya sendiri dengan --no-deps -e .). CI menguji versi yang dikunci sampai scripts/dev/refresh_ci_locks.py membuatnya ulang; pip-audit.yml setiap minggu mengaudit versi terbaru yang diizinkan dan juga kuncinya. tests/scripts/test_ci_locks_fresh.py gagal jika sebuah kunci tidak lagi memenuhi masukannya |
| Kunci perkakas CI | scripts/ci/requirements-ci-ruff.txt, -bandit.txt, -pip-audit.txt, -pip-licenses.txt, dan -pre-commit.txt | Satu penutupan yang dikunci hash untuk setiap perkakas yang dijalankan alur kerja, dikompilasi oleh skrip yang sama dari spesifikasi eksak di scripts/dev/ci_lock_table.py, dengan tanggal penguncian dan masa tunggu yang sama, dan dipasang dengan --require-hashes -r. Tidak ada alur kerja yang menuliskan versi perkakas. pre-commit membutuhkan Python 3.11 atau lebih baru, sehingga kuncinya juga, dan kunci pip-audit juga dikompilasi untuk 3.11 karena filelock terbaru yang mendukung 3.10 memiliki advisori keamanan yang belum diperbaiki. Hanya kunci pip CI yang menyematkan pip |
| Situs dokumentasi | site/package.json | site/package-lock.json di-commit dan dikonsumsi oleh npm ci |
| Pengemas VS Code | tools/vsce/package.json | tools/vsce/package-lock.json di-commit; job rilis dan publikasi menjalankan npm ci --ignore-scripts |
| CLI harness channel-smoke | tools/channel-smoke/package.json | tools/channel-smoke/package-lock.json di-commit dan dikonsumsi oleh npm ci |
| GitHub Actions | Referensi uses: yang disematkan SHA dengan komentar versi | Dependabot mengusulkan pembaruan mingguan; pengecualian membawa penanda action-pinning-exempt: |
Ratifikasi rilis
| Permukaan | Status yang diratifikasi | Rasionel |
|---|---|---|
| Dependensi runtime | Batas bawah saat ini berada di pyproject.toml [project.dependencies] | Batas bawah stabil saat ini diratifikasi sebelum rilis; tidak ada penghalang CVE runtime yang diketahui |
| Perkakas pengembangan | Batas bawah saat ini berada di extra dev dari pyproject.toml; ruff dan mypy adalah penyematan eksak di sana | Batas bawah stabil terbaru diratifikasi sebelum rilis; ruff dan mypy masing-masing disematkan ke satu versi untuk hook, CI, dan kontributor, hook mypy menyematkan pustaka yang didaftarkannya ke versi dari kunci dev, dan tests/scripts/test_ci_tool_locks.py gagal jika versinya berbeda |
| Perkakas keamanan | Batas bawah saat ini berada di extra security dari pyproject.toml | Batas bawah pemindai saat ini diratifikasi sebelum rilis |
| Perkakas rilis | Penutupan yang dikunci hash berada di scripts/release/requirements-build-linux.txt | Alur kerja rilis memasang dengan --require-hashes; skrip lokal mensyaratkan build sudah ada alih-alih diam-diam memasang dependensi yang bergerak |
| pip CI | Penyematan yang dikunci hash berada di scripts/ci/requirements-ci-pip.txt | pip 26.2 atau lebih baru menutup CVE-2026-13346; alur kerja memasangnya dengan --require-hashes, sehingga unduhannya diperiksa terhadap hash yang dipublikasikan |
| Kunci dependensi CI | Penutupan yang dikunci hash berada di scripts/ci/requirements-ci-{dev,runtime,test,prereqs}.txt | Alur kerja memasangnya dengan --require-hashes; setiap berkas mencatat tanggal penguncian, masa tunggu, dan tanggal batasnya, dan uji kesegaran menjaganya tetap selaras dengan pyproject.toml |
| Kunci perkakas CI | Penutupan yang dikunci hash berada di scripts/ci/requirements-ci-{ruff,bandit,pip-audit,pip-licenses,pre-commit}.txt | Alur kerja memasangnya dengan --require-hashes dan tidak mencantumkan versi perkakas; spesifikasinya berada di scripts/dev/ci_lock_table.py, dan tanggal penguncian, masa tunggu, serta tanggal batasnya sama dengan milik kunci dependensi |
| Perkakas dokumentasi | Rentang saat ini berada di site/package.json; resolusi eksak berada di site/package-lock.json | npm outdated tidak mengembalikan dependensi dokumentasi yang usang setelah penyegaran berkas kunci |
| GitHub Actions | Penyematan SHA yang ada dipertahankan untuk rilis saat ini; alur kerja SLSA yang dapat dipakai ulang tetap menjadi pengecualian yang disematkan dengan tag dan didokumentasikan, ditandai dengan komentar action-pinning-exempt: di release.yml | Eksekusi ulang CI publik hijau; peningkatan versi mayor action yang luas sengaja diserahkan ke PR otomasi dependensi untuk menghindari gejolak pada permukaan rilis |
| Pengemasan npm | Alur kerja publish-npm.yml berjalan pada push tag v*.*.*, dengan workflow_dispatch sebagai cadangan | Satu-satunya paket npm publik adalah @ahmed-g-gad/apothem; publikasi menunggu persetujuan operator atas environment release, yang diberikan setelah scripts/release/check-release-ready.sh lolos |
Penguncian
Berkas kunci Python milik kontributor sendiri dihasilkan sesuai permintaan dan
tidak di-commit: penutupan runtime Apothem kecil dan CLI mendukung beberapa
versi minor Python. CI adalah pengecualiannya. CI memasang berkas yang dikunci
hash di scripts/ci/: empat kunci dependensi (requirements-ci-dev.txt,
-runtime.txt, -test.txt, dan -prereqs.txt) dan satu kunci untuk setiap
perkakas yang dijalankan alur kerja (-ruff.txt, -bandit.txt,
-pip-audit.txt, -pip-licenses.txt, dan -pre-commit.txt).
python scripts/dev/refresh_ci_locks.py mengompilasi kesembilannya per tanggal
penguncian dikurangi masa tunggu 7 hari yang sama dengan milik Dependabot,
sehingga CI menguji rilis yang sudah berumur setidaknya satu minggu pada
tanggal penguncian, dan penyegaran berkas memajukannya. Setiap berkas mencatat
tanggal penguncian, masa tunggu, dan tanggal batas yang dihasilkan, dan
--check mereproduksi tanggal batas itu. Perbaikan keamanan mendesak yang
lebih baru daripada masa tunggu memerlukan penyegaran dengan
--cooldown-days 0, atau pengecualian masa tunggu untuk paketnya di
scripts/dev/ci_lock_table.py, yang mencabut masa tunggu hanya untuk paket
itu. Eksekusi mingguan pip-audit.yml mengaudit versi terbaru yang diizinkan
pyproject.toml serta kesembilan kunci, dengan menanyakan advisori keamanan ke
layanan OSV. Kontributor tetap memasang dengan pip install -e ".[dev]".
# Astral uv:
uv pip install -e ".[dev,security,release]"
uv pip freeze > requirements.dev.lock
# pip-tools:
pip-compile --extra=dev --extra=security --extra=release -o requirements.dev.lock pyproject.toml
# Plain pip:
pip install -e ".[dev,security,release]"
pip freeze > requirements.dev.lockSitus web berbeda: site/package-lock.json di-commit dan CI menggunakan
npm ci, sehingga situs dokumentasi yang dirender memiliki penutupan Node yang
dapat direproduksi.
Rasionel
- Mengapa penyematan rentang untuk Python? CLI mendukung matriks Python yang
luas, sehingga
pyproject.tomlmempertahankan batas bawah yang konservatif. CI memasang penutupan yang dikunci hash dari rentang tersebut, yang disegarkan pemelihara denganscripts/dev/refresh_ci_locks.py(iramanya direncanakan mingguan), dan eksekusi mingguanpip-audit.ymlme-resolve versi terbaru yang diizinkan untuk mengungkap masalah dengan perkakas saat ini. - Mengapa kunci Node yang di-commit? Situs web adalah artefak statis yang
di-deploy; berkas kunci memberikan build
npm ciyang deterministik untuk permukaan publik tersebut. - Mengapa Actions yang disematkan SHA? Tag dapat diubah; SHA tidak dapat diubah. Dependabot mengusulkan peningkatan SHA dan menulis ulang setiap komentar versi, sementara gerbang rilis mencatat setiap penahanan yang disengaja.
- Apa yang tidak disentuh bot pembaruan. Pembaruan versi Dependabot
(
.github/dependabot.yml) mencakup penyematan GitHub Actions, berkas kunci situs web, berkas kunci pengemas vsce (tools/vsce), berkas kunci CLI harness yang dipasang oleh channel smoke (tools/channel-smoke), pip yang dikunci hash yang dipasang CI (scripts/ci/requirements-ci-pip.txt), dan hook pre-commit. Sembilan berkas lainnya discripts/ciadalah penutupan yang dibuat ulang secara utuh denganscripts/dev/refresh_ci_locks.py; tidak satu pun menyematkan pip, dan pembaruan versi Dependabot untuk folder itu dibatasi pada pip. Batas bawah runtime dipyproject.toml, persyaratan rilis yang dikunci hash, penutupan vendor disrc/apothem/_vendor/vendor.txt, dan hook pre-commit yang disematkan seiring denganpyproject.tomldiubah secara manual, karena peningkatan satu penyematan saja akan merusak berkas-berkas yang harus selaras dengannya. Hook ruff dan mypy termasuk di antaranya:tests/scripts/test_ci_tool_locks.pygagal sampai penyematan eksak ruff dipyproject.toml, rev hook, kunci ruff, dan kunci dev memuat satu versi yang sama, dan sampai penyematan eksak mypy, rev hook mypy, dan pustaka yang didaftarkan hook itu cocok dengan kunci dev. Karena itu, pull request keamanan Dependabot untuk salah satu perkakas itu disesuaikan secara manual. Versi mayor@types/nodesitus web mengikuti batas bawah Node-nya (enginesdan.nvmrc, Node 22), sehingga Dependabot hanya mengusulkan pembaruan minor dan patch-nya; naikkan versi mayor tersebut bersamaan dengan batas bawahnya. Pembaruan versi tidak menyentuh blokoverridesnpm. Pembaruan keamanan Dependabot tetap mencakup setiap manifes, sehingga pull request keamanan dapat mengusulkan salah satu penyematan ini, atau memindahkan sebuah override; sesuaikan secara manual atau tutup pull request tersebut. - Menggabungkan pull request Dependabot. Default squash repositori mengambil
judul PR. Beberapa judul Dependabot, kebanyakan judul berkelompok yang
menyebut sebuah direktori, melampaui batas 72 karakter subjek squash;
pemeriksaan PR Title menyebutkannya, dan penggantian judul memperbaikinya.
Pull request yang mengubah berkas kunci perkakas tidak menjalankan job
ci.ymlapa pun, sehingga alur kerja audit npm mengaudit dan memasangnya, mengemas ekstensi VS Code untuk berkas kunci vsce dan menjalankan pengujian rilis vsce, dan alur kerja channel smoke berjalan untuk berkas kunci channel-smoke. Alur kerja Markdown Lint menjalankan hook markdownlint pada pull request hook pre-commit; hook lainnya tidak dijalankan di CI, jadi jalankanpre-commit run --all-filespada branch-nya sebelum menggabungkannya.
Header Kepengarangan — Baris Lisensi SPDX per Berkas
Mendefinisikan dan menegakkan penanda pengidentifikasi lisensi SPDX per berkas menggunakan header satu baris kanonik dalam sintaks komentar yang sesuai untuk setiap tipe berkas.
Disiplin Plan — Memori Kerja Efemeral Lokal-Proyek
Mengelola memori kerja efemeral lokal-proyek di .apothem/plans/ (pohon warisan .plans/ ditingkatkan melalui apothem migrate-workspace) dengan skema frontmatter, transisi siklus hidup, promosi ke ADR, dan penegakan melalui hook dan validator.