Collaboration Guide
jinflow uses git for collaboration. Every tenant AFS is a git repository from birth. Teams share work through GitHub (or any git remote).
Two Ways to Start
Section titled “Two Ways to Start”1. New Tenant (First Analyst)
Section titled “1. New Tenant (First Analyst)”Create a tenant from a domain pack, connect to GitHub, push:
# Create from packjinflow init --pack millesime --tenant szo
# Connect to GitHub (create the repo on GitHub first)jinflow afs remote https://github.com/org/afs-millesime-domaine_zufferey.git
# Push initial statejinflow afs push -m "initial setup"2. Join Existing Tenant (Second Analyst)
Section titled “2. Join Existing Tenant (Second Analyst)”Clone the AFS from GitHub — no pack needed:
# Clone from GitHubjinflow init --clone https://github.com/org/afs-millesime-domaine_zufferey.git
# Sync data and buildjinflow make --tenant millesime.domaine_zufferey --sync --cleanThis creates the full tenant layout (raw/, build/, store/) around the cloned AFS. The pack is not needed — the AFS IS the analytical framework.
Daily Workflow
Section titled “Daily Workflow”# Start of day: pull team changesjinflow afs pull
# Work: edit signals, theses, notes# Build and explorejinflow makejinflow explore
# End of day: push your changesjinflow afs push -m "added io_coefficient signal"AFS Commands
Section titled “AFS Commands”jinflow afs remote # show current remotejinflow afs remote <url> # set remote (add or update)jinflow afs status # show branch, tags, changesjinflow afs log # build logbook (git log)jinflow afs log -n 10 # last 10 entriesjinflow afs pull # pull from remote (fast-forward only)jinflow afs push # commit all changes + pushjinflow afs push -m "message" # with custom commit messageWhat Gets Versioned
Section titled “What Gets Versioned”The AFS (afs/) is the git repo. It contains:
| Content | Versioned | Notes |
|---|---|---|
| Signals, theses, verdicts | Yes | The analytical instruments |
| SMEbits, BitBundles | Yes | Expert knowledge |
| Notebooks | Yes | Investigation notes |
| Entities, lineage, contracts | Yes | Schema definitions |
| dbt macros, seeds, tests | Yes | Data transformation logic |
| Models (bronze, silver, gold) | Yes | SQL source models |
| jinflow.yml | Yes | Pack config |
| tenant/ (config, logo, seeds) | Yes | Tenant-specific content |
What is NOT in git (lives alongside the AFS):
| Content | Location | Notes |
|---|---|---|
| Raw CSVs | raw/ | Immutable source data from DLZ |
| Build artifacts | build/ | Compiled SQL, enriched CSVs (regenerable) |
| KLS + SIS | store/ | Built databases (regenerable via make) |
Auto-Commits
Section titled “Auto-Commits”jinflow make auto-commits a structured one-liner after each build:
jinflow make: ok | clean | 34/0/1 | v0.7.9 | darwin | mig | millesime.domaine_zufferey | 12.3sjinflow afs update --do-it auto-commits after syncing pack content.
These auto-commits create a build logbook visible via jinflow afs log.
Domain packs are independent git repos (e.g., jinflow-pack-millesime). They’re cloned manually:
git clone https://github.com/jinflow-io/jinflow-pack-millesime.gitConfigure the pack root so jinflow can find them:
jinflow us --pack-root ~/jinflow-packsPack changes flow into tenant AFS via jinflow afs update --do-it.
Conflict Resolution
Section titled “Conflict Resolution”jinflow afs update uses three-way merge (SHA-256 manifest):
- Only pack changed → safe update (auto-applied)
- Only tenant changed → preserved (your customization wins)
- Both changed → conflict (NOT overwritten, flagged for manual resolution)
- Force mode →
--forcemakes pack win on conflicts
jinflow afs pull uses fast-forward only. If local and remote diverge, it tells you to resolve manually with git pull --rebase.