Define source-intake workflow and repository layout v0.1 #8
Labels
No labels
area/deployment
area/governance
area/metadata
area/pipeline
area/search
type/data
type/design
type/implementation
type/testing
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Reference
Arkive/arkive#8
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Specify directories and naming conventions for original files, source records, document records, generated chunks, license evidence, and review evidence.
Define whether unreviewed candidates may temporarily exist outside committed
data/, and how that area is handled.Define rejected-source handling without retaining material that Arkive is not permitted to store.
Define stable source and document identifier generation rules.
Document how contributors verify that a file may legally be committed and redistributed.
Define the evidence required for provenance, license state, reviewer identity, review date, and bundle eligibility.
Describe how accepted files move into processing without bypassing review.
Extend the existing policies rather than replacing them.
Selecting the five pilot documents.
Changing the project's license.
Automated downloading or scraping.
Safety-critical source review.
A generalized editorial workflow application.
The documented workflow prevents unknown-license or unaccepted content from becoming bundleable.
Stable naming and identifier rules are deterministic and documented.
License and review evidence requirements are objective enough for another contributor to follow.
Rejected and metadata-only cases are handled without implying redistribution permission.
The workflow remains consistent with the current source, document, and chunk lineage model.
Review the design against the source-acceptance and license policies.
Confirm that no source file or production pipeline code is added.
Run
git diff --check.Design input for #8 — not a competing draft, you own this one. Two flags first because they affect what you're writing right now, then the longer notes.
⚠️ Flag 1 —
reviewerandreview_datedon't exist in the schema yetThis issue's scope commits to defining "the evidence required for provenance, license state, reviewer identity, review date, and bundle eligibility."
source.schema.jsoncurrently hasreview_status(pending_review/accepted/rejected) andrejection_reason— but no field recording who reviewed a source or when. There is nowhere to put reviewer identity or review date today.That's fine, it just means #9 has to add them. The reason to know now: if #8 is written assuming those fields exist, and the pilot corpus (#10, #18) gets recorded before #9 lands, every source record needs a retrofit pass. Cheap to sequence correctly, annoying to fix after the fact.
Suggested shape, minimal and non-speculative:
⚠️ Flag 2 — derivatives of no-derivatives sources aren't covered by the acceptance criteria
The current acceptance criterion reads:
That catches unknown-license material and unreviewed material. It does not catch this case:
review_status: acceptedredistributable_with_conditionswithconditions: ["no_derivatives"]document.schema.json, which offerstransformation.methodofocr,cleanup,translateNothing in the current rules stops step 4. The parent is legitimately accepted and legitimately licensed; the derivative is the problem.
license_policy.mdalready states the principle ("A translation may be a derivative work. If the original license does not allow derivative works, Arkive may not be allowed to redistribute the translation") — but it's prose, and the workflow doesn't operationalize it.Worth checking:
no_derivatives,share_alike, andnon_commercialcurrently exist only as enum strings insource.schema.json. Nothing invalidate_records.pyreads any of them. The vocabulary is defined; the enforcement isn't written yet.Proposed one-line policy rule for #8, which #9 can then enforce mechanically:
This is a policy decision, so it belongs here rather than in #9. Worth settling before #9 implements against it.
Design notes
1. Intake states are a matrix, not a third enum
The scope lists "candidate, pending review, accepted, metadata-only, rejected, and bundleable" as one lifecycle. I'd argue they're three different things:
metadata_onlyis a license statusacceptedis a review statusbundleableis a consequence of the other twocandidateisn't a record state at all — it's a file with no committed record yetThe schema already models review and license as orthogonal axes, which is the right call and worth preserving. Collapsing them into a single enum would lose information — you'd no longer be able to express "reviewed and accepted as useful, but not redistributable."
So rather than a new enum, a permission matrix where the cell determines what may exist on disk:
pending_reviewacceptedredistributableacceptedredistributable_with_conditionsacceptedmetadata_onlyacceptedunknownrejectedbundleablestays a derived assertion the validator cross-checks, never something a contributor sets by hand in isolation.validate_records.py:158already enforces exactly this for the license-status and review-status pair — the matrix just makes the full rule explicit and gives the remaining cells somewhere to live.2. Quarantine — and the reason is git history
On "whether unreviewed candidates may temporarily exist outside committed
data/": they must, and I'd put this at the top of the document as the single most important operational rule.Committing an unreviewed file to git puts it in history permanently.
git rmdoesn't remove it..gitignoredoesn't help retroactively. If Arkive later receives a takedown for something that shouldn't have been committed, the remedy is a history rewrite propagated to every clone and fork.This repo is public, so a commit isn't just permanent — it's published the moment it's pushed, and can be cloned or mirrored before anyone notices the mistake.
Practical consequence: the review gate has to sit before the first commit, not before release. An ignored
quarantine/directory where candidates land for review, with files moving intodata/sources/only when the matrix permits. This one rule does more legal risk-reduction than everything downstream of it.3. Rejected and metadata-only as tombstones
"Handle rejection without retaining material Arkive isn't permitted to store" resolves cleanly using machinery that already exists:
source.jsonwithreview_status: rejected,rejection_reason, origin URL, and reviewerdocuments.json, nochunks.jsonThe schema and validator already support this shape, so it costs nothing new. The same pattern serves
metadata_only: a record with no file. This also satisfies the criterion about not implying redistribution permission — there's simply no artifact to imply it about.4. An objective evidence bar
To make "objective enough for another contributor to follow" testable, a per-status requirement table:
redistributableevidenceentry with a URL or in-document quote, plusdate_accessedredistributable_with_conditionsconditionsenumerated, andattribution_textpopulated whenattributionis among themmetadata_only/pending_review/unknown/rejectedTwo gaps this closes, both currently passing validation:
redistributable+bundleable: truewithevidence: [].license_policy.md:126says "Do not rely only on memory or assumptions" — but nothing enforces it.conditions: ["attribution"]with noattribution_text. Attribution obligations that exist only as a checkbox tend to get dropped at packaging time.5. Jurisdiction on public-domain claims
license_policy.md:26says "government works that are legally public domain in the relevant jurisdiction" — but there's no field recording which jurisdiction, and the contributor checklist doesn't ask.Two traps worth naming explicitly in the workflow doc:
48f7989sidestepped exactly this — good call.A
jurisdictionfield on any public-domain-by-government claim would make this checkable rather than assumed.Proposed split so we don't collide
None of the above touches #9's territory — it's all policy and workflow definition, so it should merge cleanly with whatever you're drafting.
Looking at the dependency lines across the milestone, M1 is nearly serial with one real fan-out:
Worth noting #19 depends on #18 and states Milestone 1 must be complete, so there's no way to start search work early. Everything genuinely is behind #8 right now.
Suggested division, if it's useful:
meta/schemas/,pipeline/validate/, andtests/.pipeline/, disjoint from each other and from #10. Then #13 converges on both #10 and #12.For coordination I'd just follow what
AGENTS.mdalready specifies — assignment on the issue as the visible lock, feature branches pushed early, and each of us staying inside the directory boundaries the protected-boundaries section already carves out. Happy to do it differently if you'd rather keep the schema work yourself.Completed through PR #31.
The merged work establishes Arkive’s source-intake workflow and repository-layout baseline v0.1, including:
data/;no_derivatives, attribution, share-alike, non-commercial, and notice conditions;Validation passed:
git diff --check;No real source document, production pipeline implementation, schema change, database, web application, or safety-critical corpus material was added.
Remaining follow-up limitations
These limitations are intentionally recorded for Issue #9 and later implementation work:
no_derivatives,share_alike,non_commercial, attribution, and notice requirements are not yet comprehensively enforced by the validator.Issue #9 should evaluate and implement the smallest schema and validator changes necessary to enforce this approved workflow while preserving the existing source → document → chunk lineage model.