reprovane 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. reprovane-2.0.0/ARCHITECTURE.md +11 -0
  2. reprovane-2.0.0/CHANGELOG.md +36 -0
  3. reprovane-2.0.0/LICENSE +21 -0
  4. reprovane-2.0.0/MANIFEST.in +13 -0
  5. reprovane-2.0.0/MIGRATION_FROM_SCHOLARFLOW_1.md +40 -0
  6. reprovane-2.0.0/MIGRATION_TO_SCHOLARFLOW.md +31 -0
  7. reprovane-2.0.0/OLD_REPOSITORY_ARCHIVE_NOTICE.md +7 -0
  8. reprovane-2.0.0/OPERATIONS.md +71 -0
  9. reprovane-2.0.0/PKG-INFO +86 -0
  10. reprovane-2.0.0/PROVENANCE.md +27 -0
  11. reprovane-2.0.0/QUICKSTART_vi.md +137 -0
  12. reprovane-2.0.0/README.md +70 -0
  13. reprovane-2.0.0/SECURITY.md +17 -0
  14. reprovane-2.0.0/THIRD_PARTY_DATA.md +9 -0
  15. reprovane-2.0.0/USER_GUIDE_vi.md +183 -0
  16. reprovane-2.0.0/docs/architecture/discovery_provenance_citation_expansion.md +137 -0
  17. reprovane-2.0.0/docs/architecture/frontier_policy_search_validation.md +205 -0
  18. reprovane-2.0.0/docs/architecture/fulltext_acquisition.md +65 -0
  19. reprovane-2.0.0/docs/architecture/immutable_corpus_release.md +175 -0
  20. reprovane-2.0.0/docs/architecture/openalex_acquisition_migration.md +185 -0
  21. reprovane-2.0.0/docs/architecture/persistence_foundation.md +184 -0
  22. reprovane-2.0.0/docs/architecture/pinned_github_mirror_sync.md +168 -0
  23. reprovane-2.0.0/docs/architecture/publication_identity_resolution.md +201 -0
  24. reprovane-2.0.0/docs/architecture/scopus_wos_venue_intelligence.md +156 -0
  25. reprovane-2.0.0/docs/architecture/screening_separation.md +183 -0
  26. reprovane-2.0.0/docs/architecture/typed_observations.md +172 -0
  27. reprovane-2.0.0/docs/architecture/venue_resolution_scimago.md +186 -0
  28. reprovane-2.0.0/pyproject.toml +39 -0
  29. reprovane-2.0.0/reprovane/__init__.py +1 -0
  30. reprovane-2.0.0/reprovane/__main__.py +105 -0
  31. reprovane-2.0.0/reprovane/_version.py +3 -0
  32. reprovane-2.0.0/reprovane/common.py +202 -0
  33. reprovane-2.0.0/reprovane/config.py +115 -0
  34. reprovane-2.0.0/reprovane/core/__init__.py +29 -0
  35. reprovane-2.0.0/reprovane/core/artifacts.py +100 -0
  36. reprovane-2.0.0/reprovane/core/db.py +78 -0
  37. reprovane-2.0.0/reprovane/core/foundation.py +228 -0
  38. reprovane-2.0.0/reprovane/core/ids.py +11 -0
  39. reprovane-2.0.0/reprovane/core/migrations/0001_persistence_foundation.sql +222 -0
  40. reprovane-2.0.0/reprovane/core/migrations/0002_typed_observations.sql +322 -0
  41. reprovane-2.0.0/reprovane/core/migrations/0003_publication_authorship_observation.sql +53 -0
  42. reprovane-2.0.0/reprovane/core/migrations/0004_publication_identity_resolution.sql +272 -0
  43. reprovane-2.0.0/reprovane/core/migrations/0005_venue_resolution_scimago.sql +300 -0
  44. reprovane-2.0.0/reprovane/core/migrations/0006_venue_provider_attributes.sql +33 -0
  45. reprovane-2.0.0/reprovane/core/migrations/0007_openalex_acquisition.sql +52 -0
  46. reprovane-2.0.0/reprovane/core/migrations/0008_discovery_provenance.sql +138 -0
  47. reprovane-2.0.0/reprovane/core/migrations/0009_frontier_search_validation.sql +93 -0
  48. reprovane-2.0.0/reprovane/core/migrations/0010_screening_separation.sql +127 -0
  49. reprovane-2.0.0/reprovane/core/migrations/0011_immutable_corpus_release.sql +52 -0
  50. reprovane-2.0.0/reprovane/core/migrations/0012_fulltext_acquisition.sql +98 -0
  51. reprovane-2.0.0/reprovane/core/migrations/0013_legacy_v4_migration.sql +38 -0
  52. reprovane-2.0.0/reprovane/core/migrations.py +79 -0
  53. reprovane-2.0.0/reprovane/core/provenance.py +52 -0
  54. reprovane-2.0.0/reprovane/corpus_release/__init__.py +3 -0
  55. reprovane-2.0.0/reprovane/corpus_release/__main__.py +39 -0
  56. reprovane-2.0.0/reprovane/corpus_release/model.py +50 -0
  57. reprovane-2.0.0/reprovane/corpus_release/plan.py +33 -0
  58. reprovane-2.0.0/reprovane/corpus_release/portable.py +72 -0
  59. reprovane-2.0.0/reprovane/corpus_release/store.py +172 -0
  60. reprovane-2.0.0/reprovane/discovery/__init__.py +2 -0
  61. reprovane-2.0.0/reprovane/discovery/__main__.py +43 -0
  62. reprovane-2.0.0/reprovane/discovery/expansion.py +145 -0
  63. reprovane-2.0.0/reprovane/discovery/store.py +243 -0
  64. reprovane-2.0.0/reprovane/frontier/__init__.py +2 -0
  65. reprovane-2.0.0/reprovane/frontier/__main__.py +35 -0
  66. reprovane-2.0.0/reprovane/frontier/policy.py +39 -0
  67. reprovane-2.0.0/reprovane/frontier/store.py +179 -0
  68. reprovane-2.0.0/reprovane/fulltext.py +728 -0
  69. reprovane-2.0.0/reprovane/fulltext_acquisition/__init__.py +6 -0
  70. reprovane-2.0.0/reprovane/fulltext_acquisition/__main__.py +47 -0
  71. reprovane-2.0.0/reprovane/fulltext_acquisition/candidates.py +61 -0
  72. reprovane-2.0.0/reprovane/fulltext_acquisition/policy.py +77 -0
  73. reprovane-2.0.0/reprovane/fulltext_acquisition/portable.py +67 -0
  74. reprovane-2.0.0/reprovane/fulltext_acquisition/safety.py +82 -0
  75. reprovane-2.0.0/reprovane/fulltext_acquisition/store.py +372 -0
  76. reprovane-2.0.0/reprovane/fulltext_acquisition/transport.py +120 -0
  77. reprovane-2.0.0/reprovane/legacy_migration/__init__.py +2 -0
  78. reprovane-2.0.0/reprovane/legacy_migration/inventory.py +112 -0
  79. reprovane-2.0.0/reprovane/legacy_migration/normalize.py +27 -0
  80. reprovane-2.0.0/reprovane/legacy_migration/store.py +127 -0
  81. reprovane-2.0.0/reprovane/mirror/__init__.py +6 -0
  82. reprovane-2.0.0/reprovane/mirror/cache.py +144 -0
  83. reprovane-2.0.0/reprovane/mirror/github.py +103 -0
  84. reprovane-2.0.0/reprovane/mirror/models.py +83 -0
  85. reprovane-2.0.0/reprovane/mirror/pinned_files.py +81 -0
  86. reprovane-2.0.0/reprovane/mirror/scimago_sync.py +156 -0
  87. reprovane-2.0.0/reprovane/observations/__init__.py +5 -0
  88. reprovane-2.0.0/reprovane/observations/store.py +217 -0
  89. reprovane-2.0.0/reprovane/observations/validation.py +117 -0
  90. reprovane-2.0.0/reprovane/openalex.py +553 -0
  91. reprovane-2.0.0/reprovane/openalex_acquisition/__init__.py +4 -0
  92. reprovane-2.0.0/reprovane/openalex_acquisition/__main__.py +38 -0
  93. reprovane-2.0.0/reprovane/openalex_acquisition/credentials.py +24 -0
  94. reprovane-2.0.0/reprovane/openalex_acquisition/normalize.py +61 -0
  95. reprovane-2.0.0/reprovane/openalex_acquisition/observation_store.py +23 -0
  96. reprovane-2.0.0/reprovane/openalex_acquisition/spec.py +58 -0
  97. reprovane-2.0.0/reprovane/openalex_acquisition/store.py +181 -0
  98. reprovane-2.0.0/reprovane/openalex_http.py +82 -0
  99. reprovane-2.0.0/reprovane/operations/__init__.py +1 -0
  100. reprovane-2.0.0/reprovane/operations/cli.py +28 -0
  101. reprovane-2.0.0/reprovane/operations/lock.py +52 -0
  102. reprovane-2.0.0/reprovane/operations/workspace.py +149 -0
  103. reprovane-2.0.0/reprovane/pipeline.py +642 -0
  104. reprovane-2.0.0/reprovane/providers/__init__.py +1 -0
  105. reprovane-2.0.0/reprovane/providers/scimago.py +274 -0
  106. reprovane-2.0.0/reprovane/resolution/__init__.py +31 -0
  107. reprovane-2.0.0/reprovane/resolution/evidence.py +55 -0
  108. reprovane-2.0.0/reprovane/resolution/normalization.py +38 -0
  109. reprovane-2.0.0/reprovane/resolution/policy.py +72 -0
  110. reprovane-2.0.0/reprovane/resolution/resolver.py +95 -0
  111. reprovane-2.0.0/reprovane/resolution/store.py +360 -0
  112. reprovane-2.0.0/reprovane/scimago.py +825 -0
  113. reprovane-2.0.0/reprovane/scimago_repo.py +303 -0
  114. reprovane-2.0.0/reprovane/screening/__init__.py +2 -0
  115. reprovane-2.0.0/reprovane/screening/__main__.py +40 -0
  116. reprovane-2.0.0/reprovane/screening/evidence.py +52 -0
  117. reprovane-2.0.0/reprovane/screening/plan.py +83 -0
  118. reprovane-2.0.0/reprovane/screening/store.py +232 -0
  119. reprovane-2.0.0/reprovane/search_validation/__init__.py +1 -0
  120. reprovane-2.0.0/reprovane/search_validation/__main__.py +36 -0
  121. reprovane-2.0.0/reprovane/search_validation/store.py +154 -0
  122. reprovane-2.0.0/reprovane/stage09.py +29 -0
  123. reprovane-2.0.0/reprovane/venue_intelligence/__init__.py +3 -0
  124. reprovane-2.0.0/reprovane/venue_intelligence/__main__.py +40 -0
  125. reprovane-2.0.0/reprovane/venue_intelligence/parsers.py +65 -0
  126. reprovane-2.0.0/reprovane/venue_intelligence/projection.py +73 -0
  127. reprovane-2.0.0/reprovane/venue_intelligence/store.py +177 -0
  128. reprovane-2.0.0/reprovane/venue_resolution/__init__.py +10 -0
  129. reprovane-2.0.0/reprovane/venue_resolution/evidence.py +51 -0
  130. reprovane-2.0.0/reprovane/venue_resolution/normalization.py +24 -0
  131. reprovane-2.0.0/reprovane/venue_resolution/policy.py +40 -0
  132. reprovane-2.0.0/reprovane/venue_resolution/projection.py +71 -0
  133. reprovane-2.0.0/reprovane/venue_resolution/resolver.py +90 -0
  134. reprovane-2.0.0/reprovane/venue_resolution/store.py +413 -0
  135. reprovane-2.0.0/reprovane/venues.py +193 -0
  136. reprovane-2.0.0/reprovane.egg-info/PKG-INFO +86 -0
  137. reprovane-2.0.0/reprovane.egg-info/SOURCES.txt +140 -0
  138. reprovane-2.0.0/reprovane.egg-info/dependency_links.txt +1 -0
  139. reprovane-2.0.0/reprovane.egg-info/entry_points.txt +2 -0
  140. reprovane-2.0.0/reprovane.egg-info/requires.txt +2 -0
  141. reprovane-2.0.0/reprovane.egg-info/top_level.txt +1 -0
  142. reprovane-2.0.0/setup.cfg +4 -0
@@ -0,0 +1,11 @@
1
+ # Kiến trúc Reprovane
2
+
3
+ Product version ở `reprovane/_version.py`: **2.0.0**. Database schema: **13**. Tên gói không phải phiên bản định dạng dữ liệu.
4
+
5
+ Luồng chính: project/revision → acquisition/snapshot/record → typed observations → publication/venue resolution → discovery → frontier/search validation → human screening/adjudication → immutable corpus → OA fulltext. Mỗi lớp giữ bằng chứng và tham chiếu lớp trước; một bước tìm thấy dữ liệu không tự cấp quyền quyết định cho bước sau.
6
+
7
+ Người dùng bắt đầu bằng [Quick Start](QUICKSTART_vi.md) và [User Guide](USER_GUIDE_vi.md). Các tài liệu trong [docs/architecture](docs/architecture/) là hợp đồng kỹ thuật: [persistence](docs/architecture/persistence_foundation.md), [observations](docs/architecture/typed_observations.md), [publication identity](docs/architecture/publication_identity_resolution.md), [venue resolution](docs/architecture/venue_resolution_scimago.md), [provider intelligence](docs/architecture/scopus_wos_venue_intelligence.md), [acquisition](docs/architecture/openalex_acquisition_migration.md), [discovery](docs/architecture/discovery_provenance_citation_expansion.md), [frontier/search validation](docs/architecture/frontier_policy_search_validation.md), [screening](docs/architecture/screening_separation.md), [corpus](docs/architecture/immutable_corpus_release.md), [fulltext](docs/architecture/fulltext_acquisition.md) và [pinned mirror](docs/architecture/pinned_github_mirror_sync.md).
8
+
9
+ Phân giải không dùng fuzzy title để tự hợp nhất bài mơ hồ. SCImago, Scopus, WoS có ngữ nghĩa riêng. AI/OCR không sở hữu quyền quyết định trước khi đóng băng; screening thuộc con người. Fulltext failure không thay membership. Các thuật toán, quy tắc phiên bản PDF, SSRF, CAS, hash và 13 migration SQL không đổi trong rebrand.
10
+
11
+ Adapter legacy v4 chỉ đưa bằng chứng lịch sử vào ngữ cảnh riêng, không biến phân loại máy cũ thành quyết định screening/corpus hiện hành. [Migration hiện tại](MIGRATION_FROM_SCHOLARFLOW_1.md) khác với [tài liệu chuyển tiếp lịch sử](MIGRATION_TO_SCHOLARFLOW.md). Các locator `db/litintel.sqlite` và `.litintel-writer.lock` giữ nguyên để workspace/schema13 và khóa writer tương tác được. Xem [Operations](OPERATIONS.md) cho snapshot đọc, backup, upgrade và giới hạn filesystem.
@@ -0,0 +1,36 @@
1
+ # Changelog
2
+
3
+ ## 2.0.0
4
+
5
+ First public Reprovane release, bringing reproducible literature discovery, human screening, and evidence management into one review workflow.
6
+
7
+ - Collect literature from OpenAlex and expand searches through citations.
8
+ - Keep venue evidence and human review decisions traceable.
9
+ - Freeze a review corpus, organize eligible open-access full text, and track unresolved items in a manual queue.
10
+ - Verify workspace and export integrity.
11
+
12
+ Breaking package-name change: the distribution, Python import and CLI are now `reprovane`. Users of ScholarFlow 1.x can follow [the migration guide](MIGRATION_FROM_SCHOLARFLOW_1.md).
13
+
14
+ ## 1.0.0
15
+
16
+ ScholarFlow 1.0.0 promotes the validated 1.0.0-rc1 architecture without scientific-semantic changes.
17
+
18
+ - Reproducible acquisition, typed observations and conservative publication/venue identity resolution.
19
+ - Separate provider intelligence, citation discovery, bounded frontier and search validation.
20
+ - Human screening/adjudication, immutable corpus releases and policy-bound OA full-text acquisition with a manual queue.
21
+ - Hash/provenance verification and copy-on-write predecessor migration.
22
+ - Product version becomes 1.0.0; database schema remains 13 and migrations 0001–0013 are unchanged. Stable tag/release publication is a separate reviewed step.
23
+
24
+ ## 1.0.0-rc1
25
+
26
+ Initial ScholarFlow release candidate.
27
+
28
+ - Reproducible acquisition and immutable provider evidence/typed observations.
29
+ - Conservative publication/venue identity and separate provider intelligence.
30
+ - Citation discovery, bounded frontier and search validation.
31
+ - Human screening and conflict adjudication, immutable corpus releases.
32
+ - Policy-bound OA acquisition, verified PDF artifacts and manual queue.
33
+ - Copy-on-write legacy migration, offline verification/doctor, OS locks and backup-first upgrade.
34
+ - Canonical scholarflow namespace, one scholarflow console entry point and clean wheel/sdist packaging.
35
+
36
+ ScholarFlow succeeds openalex-literature-intelligence; historical lineage is in PROVENANCE.md. Product version1 does not reset schema13. Nothing is tagged or published by bootstrap preparation.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Van-Quynh Trinh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,13 @@
1
+ include LICENSE README.md CHANGELOG.md SECURITY.md ARCHITECTURE.md MIGRATION_TO_SCHOLARFLOW.md OPERATIONS.md
2
+ recursive-include reprovane/core/migrations *.sql
3
+ prune tests
4
+ prune data
5
+ prune cache
6
+ prune dist
7
+ prune build
8
+ global-exclude *.pyc *.sqlite *.db .env config.json
9
+
10
+ include PROVENANCE.md OLD_REPOSITORY_ARCHIVE_NOTICE.md
11
+ prune docs/legacy
12
+
13
+ include QUICKSTART_vi.md USER_GUIDE_vi.md MIGRATION_FROM_SCHOLARFLOW_1.md THIRD_PARTY_DATA.md
@@ -0,0 +1,40 @@
1
+ # Chuyển từ ScholarFlow 1.x sang Reprovane 2.0.0
2
+
3
+ Gói `scholarflow`, câu lệnh `scholarflow` và `import scholarflow` của bản 1 được thay bằng `reprovane`, `reprovane` và `import reprovane`. Bản 2 không cài gói tương thích hoặc bí danh lệnh cũ. Vì đây là thay đổi giao diện, version tăng thành **2.0.0**; schema vẫn **13**, không có migration 0014 cho đổi tên.
4
+
5
+ ## Trước khi chuyển
6
+
7
+ 1. Dừng mọi chương trình đang ghi workspace, gồm notebook/script Python. Không mở hai phiên bản cùng lúc để ghi.
8
+ 2. Giữ môi trường cài ScholarFlow 1 và bản wheel cũ để có thể kiểm tra lại. Các release `v1.0.0` và `v1.0.0-rc1` cùng tài sản cũ vẫn giữ nguyên.
9
+ 3. Sao lưu toàn bộ workspace sau khi dừng chương trình, gồm `db/`, dữ liệu CAS và các tệp kèm theo. Một bản sao DB đơn lẻ không chứa đủ PDF/bằng chứng CAS. Đặt bản sao ở vị trí khác, không chồng lên thư mục gốc.
10
+ 4. Chạy doctor đầy đủ bằng bản cũ, lưu kết quả và các hash quan trọng. Nếu đang có lỗi integrity, xử lý trước khi chuyển.
11
+
12
+ ## Cài riêng và kiểm tra dữ liệu cũ
13
+
14
+ Làm theo bước cài wheel trong [Quick Start](QUICKSTART_vi.md), dùng một venv mới. Trong PowerShell, thay đường dẫn workspace bằng bản sao kiểm thử của bạn:
15
+
16
+ ```powershell
17
+ $rp = "$HOME\Downloads\.venv-reprovane\Scripts\reprovane.exe"
18
+ $ws = "$HOME\Documents\existing-review-copy"
19
+ & $rp --version
20
+ & $rp doctor --offline --workspace "$ws" --full
21
+ & $rp verify --offline --workspace "$ws"
22
+ ```
23
+
24
+ Kỳ vọng version `2.0.0`, schema `13`, không thêm migration và không có vi phạm khóa ngoại. Lệnh kiểm tra dùng bản chụp DB tạm; không chuyển đổi quyết định, không niêm phong lại run, không thay thành viên corpus hay xếp hạng PDF. Không cần chạy `legacy migrate` hoặc `workspace upgrade` chỉ vì đổi tên. `legacy migrate` dành cho dữ liệu tiền nhiệm v4, không dành cho workspace ScholarFlow 1.
25
+
26
+ ## Các tên trên đĩa phải giữ nguyên
27
+
28
+ - `db/litintel.sqlite` vẫn là cơ sở dữ liệu.
29
+ - `.litintel-writer.lock` vẫn là khóa writer thực tế của bản 1.0.0 và bản 2.0.0. Một số tài liệu cũ gọi nhầm là `.scholarflow-writer.lock`; mã và wheel công khai dùng `.litintel-writer.lock`. Không tự đổi tên hoặc tạo thêm `.reprovane-writer.lock`.
30
+ - Đường dẫn CAS, các ID revision, manifest corpus/release và hash cũ giữ nguyên. Không tìm-thay tên sản phẩm trong DB/JSON đã niêm phong.
31
+
32
+ Đây là các locator tương thích dữ liệu, không phải thương hiệu hiện hành. Một khóa OS duy nhất bảo vệ writer; xóa tệp khóa không phải cách mở khóa an toàn.
33
+
34
+ ## Sửa script của bạn
35
+
36
+ Đổi `from scholarflow...` thành `from reprovane...`, đổi lệnh gọi CLI và tên distribution trong công cụ cài đặt. Không đổi `OPENALEX_API_KEY`, `UNPAYWALL_EMAIL` hoặc các tên nhà cung cấp. Cài đúng wheel từ dự án này; không cài một gói trùng tên cũ trên registry để làm shim.
37
+
38
+ Chỉ sau khi kiểm tra bản sao thành công mới áp dụng môi trường mới cho workspace chính. Nếu cần quay lại, dừng chương trình mới và dùng môi trường cũ với bản sao đã xác minh; không sửa lịch sử migration để ép mở dữ liệu.
39
+
40
+ Kho chính thức hiện là [tvquynh/reprovane](https://github.com/tvquynh/reprovane), đã đổi tên tại chỗ và giữ nguyên lịch sử. GitHub hiện chuyển hướng URL cũ `tvquynh/scholarflow` sang kho này. Mã nguồn Reprovane 2.0.0 đã có trên main; chưa tạo tag/release v2.0.0 và chưa phát hành PyPI/TestPyPI. Chuyển hướng kho GitHub không chuyển hướng tên distribution/import/CLI cũ; tiếp tục dùng môi trường riêng như hướng dẫn ở trên.
@@ -0,0 +1,31 @@
1
+ # Historical migration to ScholarFlow
2
+
3
+ Historical reference: predecessor legacy v4.1.0 -> ScholarFlow 1.0.0. Commands below require the historical v1 environment. Current users start with MIGRATION_FROM_SCHOLARFLOW_1.md and USER_GUIDE_vi.md; use `reprovane legacy --help` for the retained v4 adapter.
4
+
5
+ Legacy baseline: f70796d1ef6003e24ce3afa1328088cc515dc0a0. Product version is reported by `scholarflow --version` (1.0.0).
6
+
7
+ V4 wrote flattened OpenAlex `_raw.jsonl` and `_raw.csv`, enriched CSV/JSONL, main/excluded/source-audit/preprint CSVs, checkpoint/summary/run-metadata JSON and fetch-oa state/log/manual/downloaded outputs and PDFs. Its raw filename does not mean exact original API bytes. A legacy main or excluded group is a historical machine filtering result, never a modern human screening decision. No legacy classification becomes ScreeningDecision, ScreeningOutcome, CorpusReleaseItem or a primary FullTextArtifact.
8
+
9
+ Keep the original directory unchanged and backed up. Migration never writes there, never resumes a legacy cursor, never extracts an archive and never fuzzy-matches a title or PDF filename. Use a separate non-overlapping target. Audit inventories all ordinary files, with documented exclusions for .git, .venv, venv and __pycache__. Symlinks fail closed. Finite scope defaults: 1000 files, 64 MiB/file, 256 MiB total, 100000 rows/file; oversized sources need explicit future adapter work, not silent partial import.
10
+
11
+ ```powershell
12
+ scholarflow legacy audit --source "legacy results"
13
+ scholarflow legacy migrate --dry-run --source "legacy results"
14
+ # Write UTF-8 without PowerShell's historical UTF-16 redirect behavior:
15
+ scholarflow legacy plan --source "legacy results" --project-key imported-review | Set-Content -Encoding utf8 migration-plan.json
16
+ scholarflow legacy migrate --source "legacy results" --target "ScholarFlow workspace" --plan migration-plan.json
17
+ scholarflow legacy verify --workspace "ScholarFlow workspace" --migration-id <migration-id> --source "legacy results"
18
+ scholarflow verify --workspace "ScholarFlow workspace" --offline
19
+ ```
20
+
21
+ Dry-run emits JSON only, creates no target, and includes source version if detectable, exact relative inventory/size/SHA, type, row and identifier coverage, duplicates, planned objects and unsupported/manual warnings. Version is read from VERSION or the actual run-metadata tool_version field. Missing evidence reports unknown; contradictory versions are reported without guessing. A detected 4.1.0 is not a cryptographic proof of source software origin. The plan binds inventory hash, explicit adapter versions, target project/revision, all import/secret/duplicate/fulltext policies and the separate-target destination policy. The actual absolute target path is a runtime argument excluded from semantic hashes. Execution recomputes the plan/source before writing and rechecks before completion. Record order and duplicate occurrences are preserved, not guessed away.
22
+
23
+ Safe `_raw`/`_enriched` rows with a valid Work ID become MANUAL_IMPORT ProviderRecords in a LEGACY_V4_IMPORT snapshot. Original file bytes, row ordinals and canonical row hashes are preserved. Complete attached Work objects, if present within those families, use the accepted OpenAlex typed normalizer. Actual v4 flat rows use the separately named legacy-v4-flat profile for explicitly present publication identifiers, metadata and venue descriptions. Flattened author strings and OA/venue ranking/status fields remain exact legacy evidence; no reconstructed authorship positions, collection membership or quartile authority is manufactured. Original OpenAlex request SHA stays null, explicitly LEGACY_INCOMPLETE_REQUEST_PROVENANCE; the hashed plan is the migration import spec, not a claimed original request. Query/cursor metadata stays historical. Stage03 generates/evaluates conservative identity candidates; ambiguous/conflicting rows retain Stage03 behavior. A later live acquisition uses a new Stage07 spec and fresh cursor identity.
24
+
25
+ LegacyMigrationRun/Artifact/RecordMap/Warning tables bind exact source fingerprint and plan to project/revision, snapshot and Stage03 resolution. Files containing recognized secrets/private paths are hash-inventoried but not copied; config/logs and unsupported artifacts are not copied. Detection is conservative (whole-file refusal can include false positives) and cannot recognize every unknown secret. Known runtime credential values are checked without printing. Filenames with secret-like content are anonymized and not copied. Reconfigure OPENALEX_API_KEY and UNPAYWALL_EMAIL in runtime/User environment; never paste values into the plan.
26
+
27
+ Main/excluded CSVs and venue/source statuses are historical-only artifacts. Downloaded PDFs are SHA-inventoried/copied only as LEGACY_FULLTEXT_UNBOUND evidence, without primary selection or matching. Modern full text requires an exact sealed corpus handoff and frozen Stage11B policy; manual ingest remains unimplemented. Unknown files are listed as UNSUPPORTED_ARTIFACT, not hidden. ZIP/archive inputs remain unsupported attachments; migrate an ordinary already-prepared directory.
28
+
29
+ A migration first commits an OPEN ledger entry, then transactionally imports the logical phase, verifies source/CAS/maps/observations/snapshot/Stage03/warnings and manifest, and commits COMPLETE. A failure rolls back semantic import and leaves OPEN (or an earlier pre-creation failure), never success; orphan CAS objects can remain from pre-registration placement. Same source+same plan into its owned target reuses verified completed state or resumes the rolled-back OPEN state. A different plan requires another target. Verification can check the target without the source, but source-drift verification requires `--source`.
30
+
31
+ Rollback: keep using the unchanged v4 source. Preserve an incomplete target for diagnosis; use a new target for changed inputs/policy. Never delete the original. For existing modern DB upgrades, use `scholarflow workspace upgrade` with separate source/target/backup directories (see operations). Backups do not include private configuration or duplicate immutable CAS; the upgrade target gets a verified CAS copy. Do not manually rewrite old migration hashes or promote old classifications into new decisions.
@@ -0,0 +1,7 @@
1
+ # Predecessor archive notice — unpublished draft
2
+
3
+ For a human to publish only after ScholarFlow final acceptance:
4
+
5
+ > This repository has been superseded by ScholarFlow. It remains archived for reproducibility and historical provenance. New development continues at https://github.com/tvquynh/scholarflow.
6
+
7
+ This file is a draft. Bootstrap preparation does not create the successor repository, archive/delete the predecessor, change remotes, push, tag, merge, create a GitHub Release or upload to PyPI. The human workflow is to create/import/verify the new repository after acceptance, then archive the predecessor and add the successor notice, and release ScholarFlow 1.0.0 only when approved.
@@ -0,0 +1,71 @@
1
+ # Vận hành Reprovane
2
+
3
+ Đọc [Quick Start](QUICKSTART_vi.md) để cài và [hướng dẫn sử dụng](USER_GUIDE_vi.md) để thực hiện đề tài. Reprovane dùng Python 3.11+, `requests>=2.31,<3`, `pypdf>=6,<7`. Mã nguồn bản 2.0.0 đã có trên main của kho chính thức `tvquynh/reprovane`; chưa tạo tag/release v2.0.0 và chưa phát hành trên PyPI/TestPyPI. Các ví dụ `reprovane` dưới đây cần môi trường đã cài được đưa vào PATH; người mới dùng đường dẫn `$rp` như Quick Start.
4
+
5
+ ## Nhận diện đúng thư mục và trạng thái
6
+
7
+ Thư mục cài chứa chương trình; workspace chứa dữ liệu nghiên cứu. Đừng trộn chúng. Ghi lại đường dẫn workspace, phiên bản phần mềm, project/revision/run ID và hash manifest trong sổ theo dõi của nhóm. Trong PowerShell, `Get-Location` cho biết thư mục đang đứng; dùng đường dẫn tuyệt đối có dấu nháy để tránh thao tác nhầm.
8
+
9
+ ```text
10
+ reprovane --version
11
+ reprovane doctor --offline --workspace "research workspace" --full
12
+ reprovane verify --offline --workspace "research workspace"
13
+ ```
14
+
15
+ `--version` là 2.0.0; workspace hiện hành phải có schema 13, không có vi phạm khóa ngoại. `doctor --full` kiểm tra toàn bộ đối tượng đã niêm phong; doctor mặc định chỉ lấy mẫu một đối tượng mỗi nhóm. Workspace mới có sealed_count bằng 0 là bình thường. `database: ABSENT` yêu cầu kiểm tra đường dẫn, không phải lý do tự xóa/tạo lại dữ liệu. Trạng thái cấu hình chỉ báo biến hiện diện trong process, không đọc/in key Windows User environment.
16
+
17
+ ## Quy trình và chỗ có mạng
18
+
19
+ | Nhóm lệnh | Công việc | Kết nối |
20
+ |---|---|---|
21
+ | workspace, project | Khởi tạo, mô tả đề tài, revision | Ngoại tuyến |
22
+ | acquisition | Lấy/resume OpenAlex có giới hạn | Acquire/resume có mạng; inspect không |
23
+ | resolution, venue-resolution | Phân giải bảo thủ, niêm phong bằng chứng | Ngoại tuyến |
24
+ | scimago, venue-data | Đồng bộ nguồn ghim, import/resolve/query riêng từng provider | Sync cần mạng trừ chế độ offline/cache |
25
+ | discovery, frontier | Nguồn gốc phát hiện, trích dẫn, mở rộng có giới hạn | Các bước mở rộng/chạy acquisition có mạng |
26
+ | search-validation | So sánh chiến lược/sentinel | Ngoại tuyến trên acquisition có sẵn |
27
+ | screening | Packet, quyết định của người, phân xử | Ngoại tuyến |
28
+ | corpus | Đóng băng thành viên/metadata, export | Ngoại tuyến |
29
+ | fulltext | Kế hoạch và thu nhận OA cho corpus | Discover/acquire có thể có mạng; verify/export không |
30
+ | legacy | Audit/plan/migrate bản v4 sang workspace riêng | Ngoại tuyến |
31
+
32
+ Chạy `reprovane <nhóm> --help`, rồi `reprovane <nhóm> <lệnh> --help` để xem tham số. Các nhãn `<...>` trong mô tả là chỗ cần thay, không chép dấu ngoặc vào PowerShell. Read-only inspect/verify/doctor dùng bản chụp DB tạm và không thay byte dữ liệu nguồn. API trực tiếp cần quản lý khóa như mục sau.
33
+
34
+ ## Một writer và khóa trên đĩa
35
+
36
+ Khóa thực tế là **`.litintel-writer.lock`**, giữ nguyên từ wheel công khai ScholarFlow 1.0.0. Tài liệu cũ ghi `.scholarflow-writer.lock` là sai tên thực tế; không tạo thêm `.reprovane-writer.lock`. DB vẫn là `db/litintel.sqlite`. Đây là tên tương thích định dạng, không cần “dọn sạch” để đổi thương hiệu.
37
+
38
+ CLI ghi giữ khóa của hệ điều hành; tệp tồn tại chỉ là metadata, không chứng minh còn writer. Khi tiến trình đóng/crash, OS nhả khóa nhưng tệp có thể còn. Nếu báo active writer, tìm và dừng đúng chương trình theo cách bình thường, chờ nó đóng rồi doctor lại. Không xóa lock hoặc kill hàng loạt tiến trình để ép chạy. API Python trực tiếp phải giữ `reprovane.operations.lock.workspace_lock()` bao quanh các bước ghi liên quan. Không chạy hai phiên bản cùng ghi một workspace. Ổ mạng hoặc writer cũ không tham gia cơ chế khóa không được chứng nhận an toàn.
39
+
40
+ ## Sao lưu thường ngày
41
+
42
+ 1. Dừng mọi CLI/script/notebook đang dùng workspace, chờ kết thúc ghi.
43
+ 2. Sao chép **toàn bộ workspace** sang thư mục riêng có ngày/giờ. Giữ `db/` và toàn bộ CAS cùng nhau; không chỉ sao chép tệp SQLite khi còn writer/WAL đang thay đổi.
44
+ 3. Chạy doctor/verify trên bản sao và lưu kết quả. Giữ bản gốc; đừng dùng bản sao duy nhất làm nơi thử nghiệm.
45
+ 4. Giữ ít nhất một bản ngoài ổ đang làm việc theo chính sách nhóm. Không đưa API key hay cấu hình riêng tư vào kho Git/ZIP chia sẻ.
46
+
47
+ CAS là kho nội dung theo hash, chứa bằng chứng thô và artifact; mất CAS thì DB riêng lẻ không phục hồi đủ dữ liệu. Bản sao đầy đủ có thể chứa bài/bằng chứng nhạy cảm: kiểm soát quyền truy cập.
48
+
49
+ ## Upgrade có backup và phục hồi
50
+
51
+ Đổi tên 1.0.0 → 2.0.0 không cần upgrade schema. Khi có nhu cầu upgrade thực sự, dùng ba thư mục tách rời, không lồng nhau:
52
+
53
+ ```text
54
+ reprovane doctor --offline --workspace "current workspace" --full
55
+ reprovane workspace upgrade --workspace "current workspace" --target "upgraded workspace" --backup "verified DB backup"
56
+ reprovane verify --offline --workspace "upgraded workspace"
57
+ ```
58
+
59
+ Nguồn giữ nguyên. SQLite backup API tạo bản sao DB đầy đủ về trạng thái giao dịch; kiểm hash và migration history. Thư mục backup này **không nhân bản CAS**, còn target vận hành nhận CAS đã kiểm tra. Vì vậy giữ CAS gốc cùng DB backup. Private config/logs không được chuyển. Target thiếu upgrade manifest xác minh là chưa hoàn tất; không sử dụng như bản thành công. Replay chỉ dùng lại target nếu fingerprint/backup và mọi kiểm tra vẫn khớp; thay nguồn thì chọn target mới.
60
+
61
+ Cách phục hồi dễ nhất là dùng bản sao toàn workspace đã xác minh ở thư mục mới. Nếu người quản trị phục hồi từ DB backup riêng, đặt DB vào đúng `db/litintel.sqlite` của workspace mới và khôi phục CAS nguyên gốc tương ứng, rồi doctor/verify đầy đủ. Không đổi thành `db/reprovane.sqlite` hoặc chỉnh tay lịch sử migration. Nếu integrity vẫn lỗi, giữ nguyên bằng chứng và nhờ người phụ trách; không chạy ghi tiếp.
62
+
63
+ ## Đọc lỗi và xin hỗ trợ
64
+
65
+ Root CLI trả 0 khi thao tác thành công; 2 khi cấu hình/validation/lock không hợp lệ; 3 khi integrity/history sai; 4 cho lỗi vận hành/transport ở root scimago; 5 cho lỗi thực thi migration. Các CLI được route giữ mã an toàn 2 của module; không có mã thoát chung thể hiện include/exclude khoa học. Xem trạng thái acquisition đã lưu khi gặp lỗi mạng; không in response riêng tư ra màn hình để đoán.
66
+
67
+ Trước khi gửi issue, chạy offline doctor, lưu version, tên lệnh, mã thoát và các trường trạng thái đã bỏ dữ liệu riêng. Không gửi key, header Authorization, cookie, đường dẫn tài khoản cá nhân, DB/PDF thật. Nếu thao tác tạo đối tượng đã thành công mà lệnh kế tiếp lỗi, inspect bằng ID có sẵn trước khi chạy lại create.
68
+
69
+ ## Giới hạn tái lập
70
+
71
+ Suite E2E dùng ID và đồng hồ cố định **chỉ trong fixture**. Production vẫn sinh ID ngẫu nhiên, tham gia manifest; hai lần chạy độc lập không được hứa có cùng hash. Checksum kiểm nội dung so với hash đáng tin, không phải chữ ký nguồn, bảo đảm quyền sao chép hay chứng minh khoa học. Export từ chối symlink/tệp xung đột; dùng đích mới cho nội dung khác. UTF-8 cho JSON/JSONL/Markdown, CSV xác định dùng LF. Không sửa bytes đã niêm phong để “đẹp” hơn.
@@ -0,0 +1,86 @@
1
+ Metadata-Version: 2.4
2
+ Name: reprovane
3
+ Version: 2.0.0
4
+ Summary: Reprovane — Reproducible literature discovery, screening, and evidence management.
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/tvquynh/reprovane
7
+ Project-URL: Repository, https://github.com/tvquynh/reprovane
8
+ Project-URL: Issues, https://github.com/tvquynh/reprovane/issues
9
+ Project-URL: Documentation, https://github.com/tvquynh/reprovane#documentation
10
+ Requires-Python: >=3.11
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: requests<3,>=2.31
14
+ Requires-Dist: pypdf<7,>=6
15
+ Dynamic: license-file
16
+
17
+ # Reprovane
18
+
19
+ Reproducible literature discovery, screening, and evidence management.
20
+
21
+ Reprovane is an open-source tool that helps researchers collect literature,
22
+ record review decisions, freeze a review corpus, and organize eligible
23
+ open-access full text with a traceable record of the work.
24
+
25
+ **Reprovane 2.0.0 is the first public release of Reprovane.**
26
+
27
+ Human reviewers remain responsible for screening and study inclusion decisions.
28
+
29
+ ## What you can do
30
+
31
+ - Search and collect literature from OpenAlex with reproducible provenance.
32
+ - Expand your search through backward and forward citations.
33
+ - Track venue evidence from SCImago, Scopus, and Web of Science.
34
+ - Record human screening decisions and resolve reviewer disagreements.
35
+ - Freeze a review corpus with its selected studies and supporting metadata.
36
+ - Find eligible open-access full text and keep unresolved items in a manual queue.
37
+ - Check the integrity of your workspace and exported results.
38
+
39
+ ## Install
40
+
41
+ Requires **Python 3.11 or newer**.
42
+
43
+ ```bash
44
+ pip install reprovane
45
+ ```
46
+
47
+ You can also install a Reprovane wheel from [GitHub Releases](https://github.com/tvquynh/reprovane/releases).
48
+ For a separate Python environment and Windows setup, follow the
49
+ [Vietnamese Quick Start](QUICKSTART_vi.md).
50
+
51
+ ## Quick start
52
+
53
+ ```bash
54
+ reprovane --version
55
+ reprovane doctor --offline
56
+ reprovane workspace init --workspace "my-review"
57
+ ```
58
+
59
+ These first steps work offline and do not need an API key.
60
+ Continue with the [Quick Start](QUICKSTART_vi.md) to create your first project,
61
+ then use the [User Guide](USER_GUIDE_vi.md) for a complete review workflow.
62
+
63
+ ## How Reprovane works
64
+
65
+ Define your project → collect literature → follow citations → review studies
66
+ → freeze your corpus → organize full text → verify and export.
67
+
68
+ Keep your search plans and reviewer decisions alongside the results so the
69
+ review process can be inspected later. Full-text availability does not decide
70
+ whether a study belongs in your review.
71
+
72
+ ## Documentation
73
+
74
+ - [Quick Start — Windows, Linux, and macOS](QUICKSTART_vi.md)
75
+ - [User Guide — from search to corpus and full text](USER_GUIDE_vi.md)
76
+ - [Operations — backups, recovery, and troubleshooting](OPERATIONS.md)
77
+ - [Security and privacy](SECURITY.md)
78
+ - [Third-party data and redistribution](THIRD_PARTY_DATA.md)
79
+ - [Changelog](CHANGELOG.md)
80
+
81
+ For development and architecture details, see [Architecture](ARCHITECTURE.md).
82
+ Source and issues: [tvquynh/reprovane](https://github.com/tvquynh/reprovane).
83
+
84
+ ## License
85
+
86
+ Reprovane is available under the [MIT License](LICENSE).
@@ -0,0 +1,27 @@
1
+ # Reprovane provenance
2
+
3
+ Lineage: **OpenAlex Literature Intelligence 4.1.0 → ScholarFlow 1.0.0 → Reprovane 2.0.0**.
4
+
5
+ Reprovane 2.0.0 is the breaking distribution/import/CLI rebrand of the accepted ScholarFlow 1.0.0 source at commit `95120023dc738021963b8b1f78f81a7cfd6b2d4b`, tree `74d34d63588dfb05385c950f96c6e0d37decd3b7`. Scientific semantics, schema13, migration bytes, database/CAS paths and the actual `.litintel-writer.lock` locator remain unchanged. No `.reprovane-writer.lock` is introduced. Old documentation's `.scholarflow-writer.lock` wording did not match the shipped v1 implementation and is corrected here.
6
+
7
+ The rebrand was merge-committed into main and the same GitHub repository was renamed in place to `tvquynh/reprovane`. Its canonical URL is https://github.com/tvquynh/reprovane. GitHub currently redirects the former `tvquynh/scholarflow` repository URL. Reprovane 2.0.0 source is on main; no v2.0.0 tag/release or PyPI/TestPyPI publication has occurred. Historical v1 stable/RC tags, release IDs and assets remain intact. The predecessor remains archived and unchanged.
8
+
9
+ The ScholarFlow repository began as a separate bootstrap, not imported predecessor Git ancestry. Reprovane continues that same repository's history. The following historical bootstrap record is preserved as a dated account of that transition; statements about unpublished bootstrap activity describe that earlier milestone, not the present remote state.
10
+
11
+ ## Historical ScholarFlow bootstrap record
12
+
13
+ # ScholarFlow provenance
14
+
15
+ ScholarFlow is the successor to `tvquynh/openalex-literature-intelligence`, not a v5 rename-in-place. The predecessor's legacy/tool baseline is v4.1.0; architecture development continued through the technically accepted Stage12 implementation. ScholarFlow starts its own product version line at 1.0.0, beginning with 1.0.0rc1.
16
+
17
+ - Legacy baseline: `f70796d1ef6003e24ce3afa1328088cc515dc0a0`.
18
+ - Accepted Stage11B baseline: `87da7dff3e2ddc6dcbac0ec5fe6e8dd8241f88b5`, tree `2df6fd9a777422b5c686f42e6f3864d6d797a62a`.
19
+ - Technically accepted Stage12 implementation: `6ad3dde25d2a7a6e21591e8e6f131f3885b62ce7`, tree `0223eb31cc71d7dc18c449157d9ea20a1c9b2818`.
20
+
21
+ The predecessor Stage12 technical candidate was 5.0.0rc1; that artifact is not a ScholarFlow release. No scientific identity, screening, corpus, provider or full-text policy is redesigned here. All thirteen SQL migration filenames/order/bytes are retained. The schema version remains 13 while the product line resets to 1.
22
+
23
+ Technical workspace compatibility allowlist: `db/litintel.sqlite` and `.litintel-writer.lock` are established on-disk format/locking locators, not product/package/CLI names. Keeping them permits schema13 workspaces and writer exclusion to interoperate without an artificial data migration. Only those exact filename literals remain in the canonical namespace; no runtime import requires the predecessor package.
24
+
25
+ All accepted semantic tests are ported to scholarflow. Historical CLI/config regression references are retained under tests/legacy_reference solely to preserve scientific coverage; they are excluded from runtime wheel/sdist and are not installed console commands. Historical manuals/notices are isolated in docs/legacy/. Copyright/license notices retain their original attribution.
26
+
27
+ Intended successor repository: https://github.com/tvquynh/scholarflow. No repository has been created or pushed by this bootstrap. The release manifest records deterministic bootstrap tree/hash and artifact hashes externally to avoid self-referential source hashes. Final acceptance and any later stable release remain human/review actions.
@@ -0,0 +1,137 @@
1
+ # Bắt đầu với Reprovane
2
+
3
+ Hướng dẫn này giúp bạn cài Reprovane, tạo nơi lưu dữ liệu và lập hồ sơ đề tài đầu tiên. Bài thực hành chưa tìm bài hay tải PDF, nên không cần API key.
4
+
5
+ ## 1. Chuẩn bị
6
+
7
+ Cần **Python 3.11 trở lên**, kết nối mạng để cài phần mềm và một thư mục bạn có quyền ghi. Mở **Windows PowerShell** từ menu Start. Chép từng khối lệnh, chờ chạy xong rồi làm bước tiếp; không chép dấu `PS>` của cửa sổ PowerShell và không gõ vào dấu nhắc `>>>` của Python.
8
+
9
+ ```powershell
10
+ python --version
11
+ ```
12
+
13
+ Nếu không tìm thấy Python hoặc Windows mở Microsoft Store, cài Python từ trang chính thức rồi mở lại PowerShell. Máy có Python Launcher có thể dùng `py -3 --version` và thay `python -m venv` bằng `py -3 -m venv` ở bước sau.
14
+
15
+ ## 2. Cài Reprovane vào môi trường riêng
16
+
17
+ Tạo một thư mục làm việc trong Documents. Môi trường riêng giữ phần mềm và thư viện của Reprovane tách khỏi các công việc Python khác. Các lệnh dưới đây không cần kích hoạt môi trường hay đổi Execution Policy.
18
+
19
+ ```powershell
20
+ $base = "$HOME\Documents\Reprovane"
21
+ New-Item -ItemType Directory -Force "$base" | Out-Null
22
+ Set-Location "$base"
23
+ $env:PYTHONUTF8 = "1"
24
+ python -m venv .venv-reprovane
25
+ .\.venv-reprovane\Scripts\python.exe -m pip install --upgrade pip
26
+ .\.venv-reprovane\Scripts\python.exe -m pip install reprovane
27
+ $rp = ".\.venv-reprovane\Scripts\reprovane.exe"
28
+ & $rp --version
29
+ & $rp doctor --offline
30
+ ```
31
+
32
+ Phiên bản của hướng dẫn là `2.0.0`. Doctor in một bản ghi JSON gồm tên trường và giá trị; `offline: true`, `python_supported: true`, các thư viện trong `dependencies` có giá trị `true` là kết quả mong đợi. Thông báo chưa có API key không cản trở bài thực hành này.
33
+
34
+ Nếu Windows báo Application Control chặn `reprovane.exe`, dùng cách gọi Python module ở mục xử lý lỗi bên dưới rồi tiếp tục. Không cần tắt chính sách bảo vệ máy.
35
+
36
+ ## 3. Tạo workspace và đề tài
37
+
38
+ **Workspace** là thư mục chứa dữ liệu nghiên cứu, khác với thư mục cài phần mềm. Dùng thư mục mới cho bài thực hành; giữ dấu nháy quanh đường dẫn có khoảng trắng.
39
+
40
+ ```powershell
41
+ $ws = Join-Path $base "my-review"
42
+ & $rp workspace init --workspace "$ws"
43
+ & $rp doctor --offline --workspace "$ws"
44
+ $project = (& $rp project create --workspace "$ws" --key practice-review --display-name "Đề tài thực hành" | ConvertFrom-Json)
45
+ if ($LASTEXITCODE -ne 0) { throw "Chưa tạo được đề tài; dừng và đọc thông báo." }
46
+ $project.project_id
47
+ ```
48
+
49
+ Giữ ID vừa in ra: đó là mã riêng của đề tài này. Nếu đã tạo thành công, không chạy lại `project create` với cùng key; dùng ID đã lưu hoặc bắt đầu bài thử trong workspace mới. Workspace chưa có bài sau bước này là bình thường.
50
+
51
+ Tạo bản mô tả câu hỏi. Đây là hồ sơ thực hành; nhóm sẽ lập kế hoạch tìm kiếm và tiêu chí sàng lọc riêng trước khi làm nghiên cứu thật.
52
+
53
+ ```powershell
54
+ $manifest = Join-Path $base "practice-project.json"
55
+ @'
56
+ {
57
+ "title": "Đề tài thực hành",
58
+ "question": "Câu hỏi nghiên cứu sẽ được nhóm hoàn thiện trước khi thu thập",
59
+ "status": "TRAINING_ONLY"
60
+ }
61
+ '@ | Set-Content -Encoding utf8 "$manifest"
62
+ $revision = (& $rp project revision --workspace "$ws" --project-id $project.project_id --number 1 --manifest "$manifest" | ConvertFrom-Json)
63
+ if ($LASTEXITCODE -ne 0) { throw "Chưa tạo được phiên bản đề tài." }
64
+ $revision.revision_id
65
+ & $rp project inspect --workspace "$ws" --project-id $project.project_id
66
+ & $rp verify --offline --workspace "$ws"
67
+ ```
68
+
69
+ **Revision** là phiên bản đã lưu của mô tả đề tài. Khi thay câu hỏi, tạo revision mới để giữ lại lịch sử. Lệnh inspect cho phép đọc lại thông tin; verify kiểm tra dữ liệu đã có.
70
+
71
+ ## 4. Mở lại và tiếp tục
72
+
73
+ Đóng PowerShell không xóa dữ liệu. Lần sau mở cửa sổ mới, đặt lại đường dẫn và chế độ tiếng Việt:
74
+
75
+ ```powershell
76
+ $base = "$HOME\Documents\Reprovane"
77
+ Set-Location "$base"
78
+ $env:PYTHONUTF8 = "1"
79
+ $rp = ".\.venv-reprovane\Scripts\reprovane.exe"
80
+ $ws = Join-Path $base "my-review"
81
+ & $rp doctor --offline --workspace "$ws"
82
+ & $rp --help
83
+ ```
84
+
85
+ Đọc [Hướng dẫn sử dụng](USER_GUIDE_vi.md) để tiếp tục thu thập, theo dõi trích dẫn, sàng lọc và xuất tập bài. Con người quyết định đưa bài vào nghiên cứu; công cụ lưu bằng chứng và kết quả của quy trình đó.
86
+
87
+ ## Khi bị lỗi
88
+
89
+ | Hiện tượng | Cách xử lý |
90
+ |---|---|
91
+ | Không tìm thấy Python hoặc tệp chương trình | Kiểm tra Python và thư mục đang đứng bằng `Get-Location`; quay lại thư mục `$base`. |
92
+ | Cài đặt lỗi mạng | Kiểm tra mạng/proxy rồi chạy lại bước cài. Xem cách cài từ wheel nếu dùng tệp tải từ GitHub Releases. |
93
+ | API key chưa được cấu hình | Tiếp tục bài ngoại tuyến; cấu hình key khi đến bước tìm kiếm trong User Guide. |
94
+ | Writer đang hoạt động | Chờ chương trình đang dùng workspace kết thúc; không xóa tệp khóa để ép chạy. |
95
+ | Doctor báo database ABSENT | Kiểm tra `$ws` có đúng thư mục đã khởi tạo không. |
96
+ | Lệnh lỗi khi in tên tiếng Việt | Đặt `$env:PYTHONUTF8 = "1"` trước khi chạy; inspect trạng thái đã có trước khi tạo lại đối tượng. |
97
+ | Integrity verification failed | Dừng ghi dữ liệu, giữ nguyên thư mục và xem [hướng dẫn phục hồi](OPERATIONS.md). |
98
+
99
+ Nếu Application Control chặn launcher, dùng cùng CLI qua Python đã được cho phép:
100
+
101
+ ```powershell
102
+ $py = ".\.venv-reprovane\Scripts\python.exe"
103
+ & $py -m reprovane --version
104
+ & $py -m reprovane doctor --offline
105
+ ```
106
+
107
+ Ở các bước còn lại, thay `& $rp` bằng `& $py -m reprovane`, giữ nguyên mọi tham số phía sau. Khi mở cửa sổ mới, quay lại `$base` và đặt lại `$py`.
108
+
109
+ Khi nhờ hỗ trợ, gửi tên lệnh, mã thoát và thông báo đã bỏ thông tin riêng tư. Không gửi API key, mật khẩu, cookie, cơ sở dữ liệu hoặc PDF nghiên cứu vào issue công khai.
110
+
111
+ ## Cài từ GitHub Releases hoặc dùng ngoại tuyến
112
+
113
+ Nếu chọn wheel Reprovane từ [GitHub Releases](https://github.com/tvquynh/reprovane/releases), cài vào môi trường trên bằng lệnh sau, thay đường dẫn bằng nơi bạn lưu tệp:
114
+
115
+ ```powershell
116
+ .\.venv-reprovane\Scripts\python.exe -m pip install "C:\Downloads\reprovane-2.0.0-py3-none-any.whl"
117
+ ```
118
+
119
+ Máy không có mạng cần chuẩn bị cả các thư viện phụ thuộc. Xem [Operations](OPERATIONS.md) cho hướng dẫn cài ngoại tuyến, kiểm tra tệp và sao lưu.
120
+
121
+ ## Trên Linux/macOS
122
+
123
+ Dùng `python3 -m venv .venv-reprovane`, `.venv-reprovane/bin/python -m pip install reprovane`, rồi `.venv-reprovane/bin/reprovane --version`. Các tham số CLI giữ nguyên; thay biến/đường dẫn PowerShell bằng cú pháp shell của bạn. Không chép nguyên `& $rp` sang Bash.
124
+
125
+ ## Advanced: build from source
126
+
127
+ Dành cho người đã cài Git và muốn tự build. Chọn thư mục mới cho mã nguồn, rồi chạy:
128
+
129
+ ```powershell
130
+ git clone --branch main --single-branch https://github.com/tvquynh/reprovane.git reprovane-source
131
+ Set-Location .\reprovane-source
132
+ python -m venv .venv-build
133
+ .\.venv-build\Scripts\python.exe -m pip install build
134
+ .\.venv-build\Scripts\python.exe -m build
135
+ ```
136
+
137
+ Wheel nằm trong `dist`. Xem [Architecture](ARCHITECTURE.md) cho tài liệu kỹ thuật và [Operations](OPERATIONS.md) cho kiểm tra bản cài.
@@ -0,0 +1,70 @@
1
+ # Reprovane
2
+
3
+ Reproducible literature discovery, screening, and evidence management.
4
+
5
+ Reprovane is an open-source tool that helps researchers collect literature,
6
+ record review decisions, freeze a review corpus, and organize eligible
7
+ open-access full text with a traceable record of the work.
8
+
9
+ **Reprovane 2.0.0 is the first public release of Reprovane.**
10
+
11
+ Human reviewers remain responsible for screening and study inclusion decisions.
12
+
13
+ ## What you can do
14
+
15
+ - Search and collect literature from OpenAlex with reproducible provenance.
16
+ - Expand your search through backward and forward citations.
17
+ - Track venue evidence from SCImago, Scopus, and Web of Science.
18
+ - Record human screening decisions and resolve reviewer disagreements.
19
+ - Freeze a review corpus with its selected studies and supporting metadata.
20
+ - Find eligible open-access full text and keep unresolved items in a manual queue.
21
+ - Check the integrity of your workspace and exported results.
22
+
23
+ ## Install
24
+
25
+ Requires **Python 3.11 or newer**.
26
+
27
+ ```bash
28
+ pip install reprovane
29
+ ```
30
+
31
+ You can also install a Reprovane wheel from [GitHub Releases](https://github.com/tvquynh/reprovane/releases).
32
+ For a separate Python environment and Windows setup, follow the
33
+ [Vietnamese Quick Start](QUICKSTART_vi.md).
34
+
35
+ ## Quick start
36
+
37
+ ```bash
38
+ reprovane --version
39
+ reprovane doctor --offline
40
+ reprovane workspace init --workspace "my-review"
41
+ ```
42
+
43
+ These first steps work offline and do not need an API key.
44
+ Continue with the [Quick Start](QUICKSTART_vi.md) to create your first project,
45
+ then use the [User Guide](USER_GUIDE_vi.md) for a complete review workflow.
46
+
47
+ ## How Reprovane works
48
+
49
+ Define your project → collect literature → follow citations → review studies
50
+ → freeze your corpus → organize full text → verify and export.
51
+
52
+ Keep your search plans and reviewer decisions alongside the results so the
53
+ review process can be inspected later. Full-text availability does not decide
54
+ whether a study belongs in your review.
55
+
56
+ ## Documentation
57
+
58
+ - [Quick Start — Windows, Linux, and macOS](QUICKSTART_vi.md)
59
+ - [User Guide — from search to corpus and full text](USER_GUIDE_vi.md)
60
+ - [Operations — backups, recovery, and troubleshooting](OPERATIONS.md)
61
+ - [Security and privacy](SECURITY.md)
62
+ - [Third-party data and redistribution](THIRD_PARTY_DATA.md)
63
+ - [Changelog](CHANGELOG.md)
64
+
65
+ For development and architecture details, see [Architecture](ARCHITECTURE.md).
66
+ Source and issues: [tvquynh/reprovane](https://github.com/tvquynh/reprovane).
67
+
68
+ ## License
69
+
70
+ Reprovane is available under the [MIT License](LICENSE).
@@ -0,0 +1,17 @@
1
+ # Bảo mật khi dùng Reprovane
2
+
3
+ ## Người sử dụng cần làm gì?
4
+
5
+ Chỉ cài wheel đúng nguồn và đối chiếu hash. Để `OPENALEX_API_KEY` và `UNPAYWALL_EMAIL` trong runtime/User environment; không ghi giá trị vào source, plan, workspace, báo cáo hoặc URL chia sẻ. Doctor chỉ báo có/không trong process. Không gửi key, mật khẩu, header Authorization, cookie, hồ sơ trình duyệt hoặc DB/PDF thật lên issue công khai. Khi cần báo lỗi nhạy cảm, trước hết liên hệ người duy trì để thống nhất kênh riêng; không giả định dự án có hộp thư bảo mật chuyên dụng.
6
+
7
+ Đọc [Quick Start](QUICKSTART_vi.md) để cài, [User Guide](USER_GUIDE_vi.md) để thao tác và [Operations](OPERATIONS.md) để sao lưu. Dừng tiến trình ghi trước khi sao lưu; giữ DB và CAS. Không sửa SQL/manifest, xóa lock để vượt kiểm tra hoặc ép nhận PDF bị từ chối.
8
+
9
+ ## Ranh giới thu nhận toàn văn
10
+
11
+ Fulltext transport ghim IP công khai đã phân giải, xác thực TLS theo hostname gốc, kiểm tra redirect và giới hạn request/byte/retry/redirect. PDF phải đạt kiểm tra cấu trúc. Mặc định từ chối submitted/unknown version, không scrape landing page, không vượt paywall/anti-bot, không dùng AI/OCR dự phòng. Không tự động hóa login/SSO/cookie của cơ quan. URL và metadata nguồn là dữ liệu chưa đáng tin. Response chứa bí mật nhận diện được hoặc signed URL secret bị từ chối. Heuristic bảo mật không bảo đảm nhận diện mọi bí mật chưa biết.
12
+
13
+ ## Ranh giới dữ liệu và filesystem
14
+
15
+ Legacy migration chỉ nhận thư mục thường, có giới hạn, copy-on-write và từ chối symlink; không giải nén archive hay thực thi pickle/eval/payload. Secret/config/log của legacy được kiểm kê bằng hash thay vì sao chép. SQL bind tham số; tên bảng/cột động từ allowlist nội bộ. CLI writer dùng khóa OS; API trực tiếp phải tham gia cùng khóa. Export bất biến từ chối symlink/bytes xung đột. Filesystem có tiến trình đối kháng đồng thời và giới hạn CPU/RAM của parser PDF không được chứng nhận. DB-only backup cần CAS nguyên gốc riêng để khôi phục đủ.
16
+
17
+ Reprovane không cài CLI lịch sử hoặc shim package cũ. Mã execution tiền nhiệm chỉ ở tham chiếu test, không nằm trong wheel/sdist. Checksum chứng minh nhất quán với hash đáng tin, không xác thực nhà xuất bản hoặc quyền phân phối. Xem [Third-party data](THIRD_PARTY_DATA.md) trước khi chia sẻ dữ liệu.
@@ -0,0 +1,9 @@
1
+ # Dữ liệu từ bên thứ ba
2
+
3
+ Reprovane xử lý metadata OpenAlex và các bằng chứng nguồn xuất bản được cấu hình, gồm SCImago, Scopus, Web of Science; fulltext có thể dùng Unpaywall khi được bật. Dự án không đóng gói bộ CSV SCImago hay PDF nghiên cứu thật trong wheel/sdist.
4
+
5
+ Người dùng cần ghi nhà cung cấp, snapshot/ref/commit, checksum và thời điểm của bằng chứng. Một checksum hợp lệ không biến một mirror thành nguồn có thẩm quyền và không cho phép tự suy diễn membership/ranking ngoài phạm vi dữ liệu. Bộ đồng bộ GitHub dùng nguồn ghim theo hợp đồng [pinned mirror](docs/architecture/pinned_github_mirror_sync.md); đọc `reprovane scimago --help` và `reprovane venue-data --help` cho CLI hiện hành.
6
+
7
+ Trước khi phân phối lại dữ liệu, metadata, corpus hoặc PDF, người phụ trách phải xem điều khoản, giấy phép, nghĩa vụ ghi nguồn và giới hạn phân phối của từng nhà cung cấp/tác phẩm. Công cụ chạy được hoặc tải thành công không phải giấy phép phân phối. Nếu chưa rõ quyền, chỉ chia sẻ báo cáo/manifest phù hợp chính sách nhóm và nhờ người phụ trách kiểm tra. Không công khai toàn bộ workspace, key hoặc URL riêng tư.
8
+
9
+ Tài liệu dưới `docs/legacy/` mô tả các mirror/config/CLI của tiền nhiệm; không áp dụng tự động các cờ cũ vào Reprovane. [User Guide](USER_GUIDE_vi.md) giải thích sự khác biệt giữa bằng chứng nguồn, quyết định sàng lọc và artifact toàn văn.