openfactory 0.2.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.
- openfactory-0.2.0/LICENSE +202 -0
- openfactory-0.2.0/NOTICE +22 -0
- openfactory-0.2.0/PKG-INFO +41 -0
- openfactory-0.2.0/README.md +232 -0
- openfactory-0.2.0/openfactory/__init__.py +7 -0
- openfactory-0.2.0/openfactory/actions/__init__.py +344 -0
- openfactory-0.2.0/openfactory/actions/base.py +334 -0
- openfactory-0.2.0/openfactory/actions/catalog.py +4872 -0
- openfactory-0.2.0/openfactory/actions/floor_intents.py +431 -0
- openfactory-0.2.0/openfactory/adapters/__init__.py +0 -0
- openfactory-0.2.0/openfactory/adapters/agent/__init__.py +71 -0
- openfactory-0.2.0/openfactory/adapters/agent/base.py +358 -0
- openfactory-0.2.0/openfactory/adapters/agent/claude_code.py +1023 -0
- openfactory-0.2.0/openfactory/adapters/agent/codex.py +350 -0
- openfactory-0.2.0/openfactory/adapters/agent/kimi.py +291 -0
- openfactory-0.2.0/openfactory/adapters/agent/opencode.py +432 -0
- openfactory-0.2.0/openfactory/adapters/agent/registry.py +485 -0
- openfactory-0.2.0/openfactory/adapters/agent/roles.py +263 -0
- openfactory-0.2.0/openfactory/adapters/agent/routes.py +255 -0
- openfactory-0.2.0/openfactory/adapters/agent/session_store.py +221 -0
- openfactory-0.2.0/openfactory/adapters/agent/stream.py +367 -0
- openfactory-0.2.0/openfactory/adapters/agent/techlead.py +108 -0
- openfactory-0.2.0/openfactory/adapters/agent/token_pool.py +67 -0
- openfactory-0.2.0/openfactory/adapters/azure_devops.py +329 -0
- openfactory-0.2.0/openfactory/adapters/board/__init__.py +10 -0
- openfactory-0.2.0/openfactory/adapters/board/azure_devops.py +748 -0
- openfactory-0.2.0/openfactory/adapters/board/base.py +193 -0
- openfactory-0.2.0/openfactory/adapters/board/columns.py +68 -0
- openfactory-0.2.0/openfactory/adapters/board/factory.py +218 -0
- openfactory-0.2.0/openfactory/adapters/board/jira.py +252 -0
- openfactory-0.2.0/openfactory/adapters/board/local.py +187 -0
- openfactory-0.2.0/openfactory/adapters/board_db.py +276 -0
- openfactory-0.2.0/openfactory/adapters/board_setup/__init__.py +8 -0
- openfactory-0.2.0/openfactory/adapters/board_setup/base.py +49 -0
- openfactory-0.2.0/openfactory/adapters/board_setup/local.py +63 -0
- openfactory-0.2.0/openfactory/adapters/board_setup/registry.py +41 -0
- openfactory-0.2.0/openfactory/adapters/channel/__init__.py +4 -0
- openfactory-0.2.0/openfactory/adapters/channel/base.py +100 -0
- openfactory-0.2.0/openfactory/adapters/channel/panel.py +107 -0
- openfactory-0.2.0/openfactory/adapters/channel/registry.py +112 -0
- openfactory-0.2.0/openfactory/adapters/credential/__init__.py +8 -0
- openfactory-0.2.0/openfactory/adapters/credential/registry.py +164 -0
- openfactory-0.2.0/openfactory/adapters/environment/__init__.py +30 -0
- openfactory-0.2.0/openfactory/adapters/environment/azure_pipelines.py +412 -0
- openfactory-0.2.0/openfactory/adapters/environment/base.py +35 -0
- openfactory-0.2.0/openfactory/adapters/environment/github_actions.py +97 -0
- openfactory-0.2.0/openfactory/adapters/environment/none.py +53 -0
- openfactory-0.2.0/openfactory/adapters/environment/registry.py +160 -0
- openfactory-0.2.0/openfactory/adapters/forge/__init__.py +30 -0
- openfactory-0.2.0/openfactory/adapters/forge/azure_devops.py +1528 -0
- openfactory-0.2.0/openfactory/adapters/forge/base.py +515 -0
- openfactory-0.2.0/openfactory/adapters/forge/github.py +779 -0
- openfactory-0.2.0/openfactory/adapters/forge/local.py +660 -0
- openfactory-0.2.0/openfactory/adapters/forge/registry.py +210 -0
- openfactory-0.2.0/openfactory/adapters/github_app.py +70 -0
- openfactory-0.2.0/openfactory/adapters/notify/__init__.py +12 -0
- openfactory-0.2.0/openfactory/adapters/notify/base.py +45 -0
- openfactory-0.2.0/openfactory/adapters/notify/panel.py +43 -0
- openfactory-0.2.0/openfactory/adapters/notify/registry.py +301 -0
- openfactory-0.2.0/openfactory/adapters/reviewer/__init__.py +30 -0
- openfactory-0.2.0/openfactory/adapters/reviewer/base.py +34 -0
- openfactory-0.2.0/openfactory/adapters/reviewer/claude_code.py +140 -0
- openfactory-0.2.0/openfactory/adapters/reviewer/harness.py +154 -0
- openfactory-0.2.0/openfactory/adapters/sandbox/__init__.py +31 -0
- openfactory-0.2.0/openfactory/adapters/sandbox/base.py +410 -0
- openfactory-0.2.0/openfactory/adapters/sandbox/container.py +550 -0
- openfactory-0.2.0/openfactory/adapters/sandbox/registry.py +490 -0
- openfactory-0.2.0/openfactory/adapters/sandbox/timeouts.py +76 -0
- openfactory-0.2.0/openfactory/adapters/sandbox/worktree.py +381 -0
- openfactory-0.2.0/openfactory/adapters/tracker/__init__.py +30 -0
- openfactory-0.2.0/openfactory/adapters/tracker/azure_devops.py +904 -0
- openfactory-0.2.0/openfactory/adapters/tracker/base.py +549 -0
- openfactory-0.2.0/openfactory/adapters/tracker/github.py +529 -0
- openfactory-0.2.0/openfactory/adapters/tracker/github_board_setup.py +216 -0
- openfactory-0.2.0/openfactory/adapters/tracker/github_project.py +733 -0
- openfactory-0.2.0/openfactory/adapters/tracker/jira.py +575 -0
- openfactory-0.2.0/openfactory/adapters/tracker/local.py +379 -0
- openfactory-0.2.0/openfactory/adapters/tracker/parse.py +231 -0
- openfactory-0.2.0/openfactory/adapters/tracker/registry.py +200 -0
- openfactory-0.2.0/openfactory/after_merge.py +51 -0
- openfactory-0.2.0/openfactory/api/__init__.py +4 -0
- openfactory-0.2.0/openfactory/api/app.py +2627 -0
- openfactory-0.2.0/openfactory/api/metrics_view.py +337 -0
- openfactory-0.2.0/openfactory/api/panel.html +3419 -0
- openfactory-0.2.0/openfactory/approvals.py +86 -0
- openfactory-0.2.0/openfactory/box_prove.py +1458 -0
- openfactory-0.2.0/openfactory/cli.py +3298 -0
- openfactory-0.2.0/openfactory/cli_refusals.py +169 -0
- openfactory-0.2.0/openfactory/conformance/__init__.py +19 -0
- openfactory-0.2.0/openfactory/conformance/adapters.py +622 -0
- openfactory-0.2.0/openfactory/contracts/__init__.py +65 -0
- openfactory-0.2.0/openfactory/contracts/bot.py +42 -0
- openfactory-0.2.0/openfactory/contracts/commands.py +183 -0
- openfactory-0.2.0/openfactory/contracts/decision.py +286 -0
- openfactory-0.2.0/openfactory/contracts/manifest.py +713 -0
- openfactory-0.2.0/openfactory/contracts/product.py +95 -0
- openfactory-0.2.0/openfactory/contracts/profile.py +214 -0
- openfactory-0.2.0/openfactory/contracts/project.py +353 -0
- openfactory-0.2.0/openfactory/contracts/refs.py +155 -0
- openfactory-0.2.0/openfactory/contracts/review.py +52 -0
- openfactory-0.2.0/openfactory/contracts/run.py +326 -0
- openfactory-0.2.0/openfactory/contracts/state.py +64 -0
- openfactory-0.2.0/openfactory/contracts/ticket.py +113 -0
- openfactory-0.2.0/openfactory/credentials.py +356 -0
- openfactory-0.2.0/openfactory/doctor.py +1577 -0
- openfactory-0.2.0/openfactory/doors.py +238 -0
- openfactory-0.2.0/openfactory/environ.py +251 -0
- openfactory-0.2.0/openfactory/factory.py +460 -0
- openfactory-0.2.0/openfactory/floor/__init__.py +31 -0
- openfactory-0.2.0/openfactory/floor/ladder.py +655 -0
- openfactory-0.2.0/openfactory/floor/reading.py +302 -0
- openfactory-0.2.0/openfactory/identity/__init__.py +14 -0
- openfactory-0.2.0/openfactory/identity/base.py +95 -0
- openfactory-0.2.0/openfactory/identity/local.py +186 -0
- openfactory-0.2.0/openfactory/identity/oidc.py +633 -0
- openfactory-0.2.0/openfactory/identity/people.py +352 -0
- openfactory-0.2.0/openfactory/identity/registry.py +91 -0
- openfactory-0.2.0/openfactory/knowledge/__init__.py +76 -0
- openfactory-0.2.0/openfactory/knowledge/bundle.py +219 -0
- openfactory-0.2.0/openfactory/knowledge/check.py +167 -0
- openfactory-0.2.0/openfactory/knowledge/contracts.py +407 -0
- openfactory-0.2.0/openfactory/knowledge/experiment.py +118 -0
- openfactory-0.2.0/openfactory/knowledge/gaps.py +118 -0
- openfactory-0.2.0/openfactory/knowledge/gate.py +330 -0
- openfactory-0.2.0/openfactory/knowledge/gather.py +156 -0
- openfactory-0.2.0/openfactory/knowledge/generator.py +822 -0
- openfactory-0.2.0/openfactory/knowledge/inventory.py +557 -0
- openfactory-0.2.0/openfactory/knowledge/okf.py +369 -0
- openfactory-0.2.0/openfactory/knowledge/pipeline.py +333 -0
- openfactory-0.2.0/openfactory/knowledge/render.py +146 -0
- openfactory-0.2.0/openfactory/knowledge/service.py +53 -0
- openfactory-0.2.0/openfactory/knowledge/staleness.py +112 -0
- openfactory-0.2.0/openfactory/language/__init__.py +15 -0
- openfactory-0.2.0/openfactory/language/assent.py +130 -0
- openfactory-0.2.0/openfactory/loader.py +156 -0
- openfactory-0.2.0/openfactory/memory/__init__.py +29 -0
- openfactory-0.2.0/openfactory/memory/ledger.py +215 -0
- openfactory-0.2.0/openfactory/memory/messages.py +406 -0
- openfactory-0.2.0/openfactory/memory/recall.py +303 -0
- openfactory-0.2.0/openfactory/memory/store.py +157 -0
- openfactory-0.2.0/openfactory/memory/transcript.py +267 -0
- openfactory-0.2.0/openfactory/namespace.py +258 -0
- openfactory-0.2.0/openfactory/observability/__init__.py +23 -0
- openfactory-0.2.0/openfactory/observability/events.py +188 -0
- openfactory-0.2.0/openfactory/observability/metrics.py +191 -0
- openfactory-0.2.0/openfactory/observability/query.py +80 -0
- openfactory-0.2.0/openfactory/observability/registry.py +253 -0
- openfactory-0.2.0/openfactory/observability/sqlite_metrics.py +203 -0
- openfactory-0.2.0/openfactory/observability/trajectory.py +243 -0
- openfactory-0.2.0/openfactory/onboarding/__init__.py +64 -0
- openfactory-0.2.0/openfactory/onboarding/concepts.py +450 -0
- openfactory-0.2.0/openfactory/onboarding/context.py +2399 -0
- openfactory-0.2.0/openfactory/onboarding/cover.py +97 -0
- openfactory-0.2.0/openfactory/onboarding/deployment.py +807 -0
- openfactory-0.2.0/openfactory/onboarding/firstrun.py +1637 -0
- openfactory-0.2.0/openfactory/onboarding/history.py +363 -0
- openfactory-0.2.0/openfactory/onboarding/infer.py +2736 -0
- openfactory-0.2.0/openfactory/onboarding/live_ci.py +162 -0
- openfactory-0.2.0/openfactory/onboarding/onboard.py +1070 -0
- openfactory-0.2.0/openfactory/onboarding/propose_manifest.py +349 -0
- openfactory-0.2.0/openfactory/onboarding/questions.py +137 -0
- openfactory-0.2.0/openfactory/onboarding/readiness.py +1073 -0
- openfactory-0.2.0/openfactory/onboarding/renew.py +239 -0
- openfactory-0.2.0/openfactory/onboarding/spend.py +82 -0
- openfactory-0.2.0/openfactory/ops/__init__.py +6 -0
- openfactory-0.2.0/openfactory/ops/impediment.py +288 -0
- openfactory-0.2.0/openfactory/orchestrator/__init__.py +26 -0
- openfactory-0.2.0/openfactory/orchestrator/context.py +231 -0
- openfactory-0.2.0/openfactory/orchestrator/errors.py +27 -0
- openfactory-0.2.0/openfactory/orchestrator/machine.py +2617 -0
- openfactory-0.2.0/openfactory/orchestrator/merge_policy.py +203 -0
- openfactory-0.2.0/openfactory/orchestrator/promotion.py +249 -0
- openfactory-0.2.0/openfactory/orchestrator/risk.py +191 -0
- openfactory-0.2.0/openfactory/orchestrator/validation.py +172 -0
- openfactory-0.2.0/openfactory/org_defaults/engineering.md +75 -0
- openfactory-0.2.0/openfactory/org_defaults/floor.yaml +182 -0
- openfactory-0.2.0/openfactory/org_defaults/profiles/prototype.yaml +16 -0
- openfactory-0.2.0/openfactory/org_defaults/profiles/regulated.yaml +35 -0
- openfactory-0.2.0/openfactory/org_defaults/requirements/0000-template.md +39 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/coordinator.md +48 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/executor.md +92 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/planner.md +117 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/product.md +71 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/recovery.md +33 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/sizer.md +62 -0
- openfactory-0.2.0/openfactory/org_defaults/roles/techlead.md +61 -0
- openfactory-0.2.0/openfactory/org_defaults/tdd.md +10 -0
- openfactory-0.2.0/openfactory/own_work.py +41 -0
- openfactory-0.2.0/openfactory/paths.py +117 -0
- openfactory-0.2.0/openfactory/plugins.py +208 -0
- openfactory-0.2.0/openfactory/policy/__init__.py +10 -0
- openfactory-0.2.0/openfactory/policy/authz.py +105 -0
- openfactory-0.2.0/openfactory/policy/census.py +161 -0
- openfactory-0.2.0/openfactory/policy/conformance.py +300 -0
- openfactory-0.2.0/openfactory/policy/floor.py +42 -0
- openfactory-0.2.0/openfactory/policy/presets.py +172 -0
- openfactory-0.2.0/openfactory/policy/profiles.py +275 -0
- openfactory-0.2.0/openfactory/policy/protected.py +169 -0
- openfactory-0.2.0/openfactory/policy/test_work.py +70 -0
- openfactory-0.2.0/openfactory/preflight.py +577 -0
- openfactory-0.2.0/openfactory/presets/node.yaml +6 -0
- openfactory-0.2.0/openfactory/presets/python.yaml +9 -0
- openfactory-0.2.0/openfactory/presets/security-oss.yaml +26 -0
- openfactory-0.2.0/openfactory/presets/terraform.yaml +8 -0
- openfactory-0.2.0/openfactory/product/__init__.py +56 -0
- openfactory-0.2.0/openfactory/product/asked.py +172 -0
- openfactory-0.2.0/openfactory/product/authoring.py +1791 -0
- openfactory-0.2.0/openfactory/product/board.py +484 -0
- openfactory-0.2.0/openfactory/product/brownfield.py +210 -0
- openfactory-0.2.0/openfactory/product/case.py +409 -0
- openfactory-0.2.0/openfactory/product/channel.py +1437 -0
- openfactory-0.2.0/openfactory/product/config.py +364 -0
- openfactory-0.2.0/openfactory/product/confirm.py +801 -0
- openfactory-0.2.0/openfactory/product/conversation.py +49 -0
- openfactory-0.2.0/openfactory/product/corpus.py +462 -0
- openfactory-0.2.0/openfactory/product/domain.py +242 -0
- openfactory-0.2.0/openfactory/product/facts.py +209 -0
- openfactory-0.2.0/openfactory/product/followup.py +647 -0
- openfactory-0.2.0/openfactory/product/intents.py +641 -0
- openfactory-0.2.0/openfactory/product/loader.py +198 -0
- openfactory-0.2.0/openfactory/product/module.py +3100 -0
- openfactory-0.2.0/openfactory/product/needs_action.py +198 -0
- openfactory-0.2.0/openfactory/product/onboard.py +331 -0
- openfactory-0.2.0/openfactory/product/queue.py +273 -0
- openfactory-0.2.0/openfactory/product/reading.py +130 -0
- openfactory-0.2.0/openfactory/product/release.py +153 -0
- openfactory-0.2.0/openfactory/product/requester.py +55 -0
- openfactory-0.2.0/openfactory/product/role.py +1356 -0
- openfactory-0.2.0/openfactory/product/staging.py +477 -0
- openfactory-0.2.0/openfactory/product/triage.py +277 -0
- openfactory-0.2.0/openfactory/product/voice.py +2080 -0
- openfactory-0.2.0/openfactory/product/workspace.py +182 -0
- openfactory-0.2.0/openfactory/registry.py +526 -0
- openfactory-0.2.0/openfactory/review/__init__.py +11 -0
- openfactory-0.2.0/openfactory/review/verdict.py +199 -0
- openfactory-0.2.0/openfactory/runtime/__init__.py +0 -0
- openfactory-0.2.0/openfactory/runtime/boxed_job.py +399 -0
- openfactory-0.2.0/openfactory/runtime/card_repo.py +146 -0
- openfactory-0.2.0/openfactory/runtime/host.py +91 -0
- openfactory-0.2.0/openfactory/runtime/repo_cache.py +296 -0
- openfactory-0.2.0/openfactory/runtime/temporal/__init__.py +26 -0
- openfactory-0.2.0/openfactory/runtime/temporal/activities.py +5081 -0
- openfactory-0.2.0/openfactory/runtime/temporal/connection.py +89 -0
- openfactory-0.2.0/openfactory/runtime/temporal/io.py +639 -0
- openfactory-0.2.0/openfactory/runtime/temporal/poller.py +185 -0
- openfactory-0.2.0/openfactory/runtime/temporal/schedule.py +465 -0
- openfactory-0.2.0/openfactory/runtime/temporal/starter.py +54 -0
- openfactory-0.2.0/openfactory/runtime/temporal/view.py +884 -0
- openfactory-0.2.0/openfactory/runtime/temporal/worker.py +325 -0
- openfactory-0.2.0/openfactory/runtime/temporal/workflow.py +2459 -0
- openfactory-0.2.0/openfactory/runtime/toolbox.py +163 -0
- openfactory-0.2.0/openfactory/scheduler.py +75 -0
- openfactory-0.2.0/openfactory/semver.py +35 -0
- openfactory-0.2.0/openfactory/techlead/__init__.py +38 -0
- openfactory-0.2.0/openfactory/techlead/classify.py +427 -0
- openfactory-0.2.0/openfactory/techlead/conversation.py +1401 -0
- openfactory-0.2.0/openfactory/techlead/diagnosis.py +251 -0
- openfactory-0.2.0/openfactory/techlead/memory.py +264 -0
- openfactory-0.2.0/openfactory/techlead/pack.py +169 -0
- openfactory-0.2.0/openfactory/techlead/voice.py +679 -0
- openfactory-0.2.0/openfactory/techlead/watch.py +638 -0
- openfactory-0.2.0/openfactory/testing/__init__.py +1 -0
- openfactory-0.2.0/openfactory/testing/local_flow.py +272 -0
- openfactory-0.2.0/openfactory/util/__init__.py +0 -0
- openfactory-0.2.0/openfactory/util/bounded.py +77 -0
- openfactory-0.2.0/openfactory/util/causes.py +125 -0
- openfactory-0.2.0/openfactory/util/scratch.py +80 -0
- openfactory-0.2.0/openfactory.egg-info/PKG-INFO +41 -0
- openfactory-0.2.0/openfactory.egg-info/SOURCES.txt +745 -0
- openfactory-0.2.0/openfactory.egg-info/dependency_links.txt +1 -0
- openfactory-0.2.0/openfactory.egg-info/entry_points.txt +2 -0
- openfactory-0.2.0/openfactory.egg-info/requires.txt +23 -0
- openfactory-0.2.0/openfactory.egg-info/top_level.txt +1 -0
- openfactory-0.2.0/pyproject.toml +229 -0
- openfactory-0.2.0/setup.cfg +4 -0
- openfactory-0.2.0/tests/test_a_banner_line_does_not_kill_the_review.py +114 -0
- openfactory-0.2.0/tests/test_a_budget_nothing_spends_is_not_a_defect.py +352 -0
- openfactory-0.2.0/tests/test_a_card_says_who_asked_for_it.py +109 -0
- openfactory-0.2.0/tests/test_a_case_does_not_outlive_its_test.py +68 -0
- openfactory-0.2.0/tests/test_a_concept_is_earned_not_declared.py +366 -0
- openfactory-0.2.0/tests/test_a_context_repository_is_creatable_on_azure_too.py +212 -0
- openfactory-0.2.0/tests/test_a_count_is_a_number_not_a_sentence.py +117 -0
- openfactory-0.2.0/tests/test_a_credential_is_asked_of_its_own_axis.py +464 -0
- openfactory-0.2.0/tests/test_a_credential_is_scoped.py +329 -0
- openfactory-0.2.0/tests/test_a_credential_only_goes_to_its_own_host.py +249 -0
- openfactory-0.2.0/tests/test_a_decision_is_written_down.py +320 -0
- openfactory-0.2.0/tests/test_a_declared_environment_is_observed_or_named.py +183 -0
- openfactory-0.2.0/tests/test_a_delivered_ticket_is_not_rerun.py +141 -0
- openfactory-0.2.0/tests/test_a_disabled_project_does_not_look_armed.py +218 -0
- openfactory-0.2.0/tests/test_a_double_without_intake_answers_every_turn.py +156 -0
- openfactory-0.2.0/tests/test_a_failed_board_read_is_not_a_wrong_root.py +156 -0
- openfactory-0.2.0/tests/test_a_failing_setup_is_not_silent.py +163 -0
- openfactory-0.2.0/tests/test_a_file_nothing_describes_is_the_least_safe_to_change.py +480 -0
- openfactory-0.2.0/tests/test_a_fingerprint_gains_a_reader.py +380 -0
- openfactory-0.2.0/tests/test_a_frame_does_not_erase_what_it_omits.py +243 -0
- openfactory-0.2.0/tests/test_a_free_deployment_can_read_its_logs.py +335 -0
- openfactory-0.2.0/tests/test_a_free_deployment_resumes_its_own_sessions.py +532 -0
- openfactory-0.2.0/tests/test_a_fresh_install_registers_no_projects.py +65 -0
- openfactory-0.2.0/tests/test_a_gate_is_not_a_stall.py +232 -0
- openfactory-0.2.0/tests/test_a_gate_that_could_not_run.py +367 -0
- openfactory-0.2.0/tests/test_a_gate_that_holds_says_so_where_the_person_decides.py +422 -0
- openfactory-0.2.0/tests/test_a_green_deploy_asks_somebody_to_look.py +162 -0
- openfactory-0.2.0/tests/test_a_green_environment_is_green_for_THIS_change.py +143 -0
- openfactory-0.2.0/tests/test_a_hostile_value_stays_data.py +311 -0
- openfactory-0.2.0/tests/test_a_human_gate_is_not_a_review.py +225 -0
- openfactory-0.2.0/tests/test_a_jira_project_is_a_board.py +385 -0
- openfactory-0.2.0/tests/test_a_killed_mutation_run_cannot_hide.py +92 -0
- openfactory-0.2.0/tests/test_a_local_deployment_names_no_vendor.py +256 -0
- openfactory-0.2.0/tests/test_a_manifest_that_loads_is_not_a_manifest_that_is_right.py +434 -0
- openfactory-0.2.0/tests/test_a_message_never_claims_an_action_nobody_takes.py +166 -0
- openfactory-0.2.0/tests/test_a_message_only_teaches_a_verb_the_channel_parses.py +114 -0
- openfactory-0.2.0/tests/test_a_model_nobody_can_run_is_not_a_setting.py +325 -0
- openfactory-0.2.0/tests/test_a_named_check_is_not_dropped.py +238 -0
- openfactory-0.2.0/tests/test_a_negation_the_bridge_carries_is_refused.py +88 -0
- openfactory-0.2.0/tests/test_a_pass_in_flight_is_not_a_gate.py +208 -0
- openfactory-0.2.0/tests/test_a_pass_that_changed_nothing.py +259 -0
- openfactory-0.2.0/tests/test_a_path_nothing_declares_is_not_the_freest.py +299 -0
- openfactory-0.2.0/tests/test_a_path_registers_itself.py +176 -0
- openfactory-0.2.0/tests/test_a_paused_factory_says_so.py +128 -0
- openfactory-0.2.0/tests/test_a_person_is_invited_not_signed_up.py +501 -0
- openfactory-0.2.0/tests/test_a_personal_accounts_board_is_readable.py +187 -0
- openfactory-0.2.0/tests/test_a_personal_boards_columns_can_be_read.py +138 -0
- openfactory-0.2.0/tests/test_a_poller_that_is_on_is_not_a_poller_that_ticks.py +215 -0
- openfactory-0.2.0/tests/test_a_preexisting_context_repo_is_declarable.py +214 -0
- openfactory-0.2.0/tests/test_a_probe_set_is_pinned_whole.py +233 -0
- openfactory-0.2.0/tests/test_a_project_can_change_the_language_it_speaks_first.py +124 -0
- openfactory-0.2.0/tests/test_a_project_declares_what_it_is.py +612 -0
- openfactory-0.2.0/tests/test_a_project_is_not_registered_as_the_wrong_vendor.py +148 -0
- openfactory-0.2.0/tests/test_a_proof_that_was_not_recorded_says_so.py +67 -0
- openfactory-0.2.0/tests/test_a_proposal_can_carry_what_to_change.py +268 -0
- openfactory-0.2.0/tests/test_a_proposed_command_can_run_where_the_box_runs_it.py +140 -0
- openfactory-0.2.0/tests/test_a_pull_that_changes_nothing_is_impossible_to_miss.py +110 -0
- openfactory-0.2.0/tests/test_a_question_reaches_the_person_who_asked.py +400 -0
- openfactory-0.2.0/tests/test_a_range_is_a_citation.py +92 -0
- openfactory-0.2.0/tests/test_a_rebuild_is_not_a_change.py +253 -0
- openfactory-0.2.0/tests/test_a_ref_that_is_not_a_number.py +128 -0
- openfactory-0.2.0/tests/test_a_rejected_review_can_be_asked_again.py +446 -0
- openfactory-0.2.0/tests/test_a_remedy_names_a_document_that_exists.py +172 -0
- openfactory-0.2.0/tests/test_a_repaired_card_is_announced_on_any_tracker.py +230 -0
- openfactory-0.2.0/tests/test_a_repository_on_the_former_name_is_refused_at_every_door.py +469 -0
- openfactory-0.2.0/tests/test_a_resume_re_enters_the_merge.py +309 -0
- openfactory-0.2.0/tests/test_a_retired_pipeline_is_not_a_gate.py +290 -0
- openfactory-0.2.0/tests/test_a_review_belongs_to_the_code_it_read.py +306 -0
- openfactory-0.2.0/tests/test_a_scratch_directory_is_the_only_thing_we_delete.py +163 -0
- openfactory-0.2.0/tests/test_a_skip_is_something_that_happened.py +157 -0
- openfactory-0.2.0/tests/test_a_staged_decision_survives_a_refresh.py +566 -0
- openfactory-0.2.0/tests/test_a_stranger_can_add_a_role.py +830 -0
- openfactory-0.2.0/tests/test_a_stranger_can_add_an_adapter.py +474 -0
- openfactory-0.2.0/tests/test_a_suite_that_stopped_collecting_is_not_a_green_suite.py +526 -0
- openfactory-0.2.0/tests/test_a_ticket_ref_is_never_typed_as_a_number.py +241 -0
- openfactory-0.2.0/tests/test_a_ticket_written_in_portuguese.py +180 -0
- openfactory-0.2.0/tests/test_a_typed_instruction_reaches_the_same_row_as_the_button.py +584 -0
- openfactory-0.2.0/tests/test_a_vendor_error_code_is_not_a_status.py +86 -0
- openfactory-0.2.0/tests/test_a_verb_says_what_to_put_in_it.py +230 -0
- openfactory-0.2.0/tests/test_a_wait_can_say_until_when.py +168 -0
- openfactory-0.2.0/tests/test_a_wedged_job_has_an_exit.py +350 -0
- openfactory-0.2.0/tests/test_a_wedged_job_is_seen.py +114 -0
- openfactory-0.2.0/tests/test_a_write_that_did_not_land_is_not_counted.py +95 -0
- openfactory-0.2.0/tests/test_a_yes_is_an_answer.py +476 -0
- openfactory-0.2.0/tests/test_accept_flows_end_to_end.py +168 -0
- openfactory-0.2.0/tests/test_acceptance_loop.py +462 -0
- openfactory-0.2.0/tests/test_accepting_starts_the_work.py +294 -0
- openfactory-0.2.0/tests/test_acknowledgement.py +217 -0
- openfactory-0.2.0/tests/test_adapter_conformance_suite.py +201 -0
- openfactory-0.2.0/tests/test_advisory_findings_survive_save.py +199 -0
- openfactory-0.2.0/tests/test_agent_harness.py +794 -0
- openfactory-0.2.0/tests/test_agent_resume_c2.py +371 -0
- openfactory-0.2.0/tests/test_agent_roles.py +127 -0
- openfactory-0.2.0/tests/test_agent_stream.py +81 -0
- openfactory-0.2.0/tests/test_agent_token_pool.py +297 -0
- openfactory-0.2.0/tests/test_already_asked_is_answered_from_the_board_not_the_transcript.py +200 -0
- openfactory-0.2.0/tests/test_an_advisory_gate_cannot_hold_a_pickup.py +215 -0
- openfactory-0.2.0/tests/test_an_advisory_gate_reports_and_never_blocks.py +176 -0
- openfactory-0.2.0/tests/test_an_environment_written_before_this_change_still_resolves_the_old_path.py +120 -0
- openfactory-0.2.0/tests/test_an_intake_is_a_typed_case.py +285 -0
- openfactory-0.2.0/tests/test_an_open_question_can_be_retired.py +272 -0
- openfactory-0.2.0/tests/test_an_open_question_is_an_offer_not_a_toll.py +168 -0
- openfactory-0.2.0/tests/test_an_unread_review_is_not_a_rejection.py +83 -0
- openfactory-0.2.0/tests/test_an_unreadable_store_is_not_an_empty_one.py +257 -0
- openfactory-0.2.0/tests/test_api.py +111 -0
- openfactory-0.2.0/tests/test_board_is_vendor_neutral.py +124 -0
- openfactory-0.2.0/tests/test_board_read_cost.py +219 -0
- openfactory-0.2.0/tests/test_bot_push.py +22 -0
- openfactory-0.2.0/tests/test_box_carries_the_provider_kind.py +120 -0
- openfactory-0.2.0/tests/test_box_prove.py +500 -0
- openfactory-0.2.0/tests/test_breakdown_reuses_what_exists.py +324 -0
- openfactory-0.2.0/tests/test_brownfield_wired.py +207 -0
- openfactory-0.2.0/tests/test_c18_has_an_azure_expression.py +129 -0
- openfactory-0.2.0/tests/test_c18_reaches_every_entry_point.py +82 -0
- openfactory-0.2.0/tests/test_card_maintenance.py +1465 -0
- openfactory-0.2.0/tests/test_card_maintenance_channel.py +1753 -0
- openfactory-0.2.0/tests/test_causes.py +190 -0
- openfactory-0.2.0/tests/test_ci_runs_what_we_run.py +246 -0
- openfactory-0.2.0/tests/test_client_board_is_not_a_test_bench.py +112 -0
- openfactory-0.2.0/tests/test_commit_workflow_strip.py +171 -0
- openfactory-0.2.0/tests/test_compose_forwards_the_whole_env_file.py +56 -0
- openfactory-0.2.0/tests/test_confirmation_by_click.py +648 -0
- openfactory-0.2.0/tests/test_confirmation_is_understood.py +438 -0
- openfactory-0.2.0/tests/test_context.py +248 -0
- openfactory-0.2.0/tests/test_conversation_worlds.py +368 -0
- openfactory-0.2.0/tests/test_corpus_health_and_board_placement.py +206 -0
- openfactory-0.2.0/tests/test_create_repository_survives_an_app_token.py +111 -0
- openfactory-0.2.0/tests/test_decision.py +86 -0
- openfactory-0.2.0/tests/test_decision_loop.py +454 -0
- openfactory-0.2.0/tests/test_deploy_watch_workflow.py +169 -0
- openfactory-0.2.0/tests/test_diff_hygiene.py +83 -0
- openfactory-0.2.0/tests/test_doctor.py +408 -0
- openfactory-0.2.0/tests/test_doctor_checks_the_product_link.py +192 -0
- openfactory-0.2.0/tests/test_env_apply_answers_in_the_readers_language.py +270 -0
- openfactory-0.2.0/tests/test_env_apply_takes_a_path_like_env_read.py +87 -0
- openfactory-0.2.0/tests/test_env_proposes_before_it_verifies.py +966 -0
- openfactory-0.2.0/tests/test_event_sinks.py +128 -0
- openfactory-0.2.0/tests/test_every_FROM_the_release_builds_resolves_without_the_local_daemon.py +252 -0
- openfactory-0.2.0/tests/test_every_image_the_compose_file_names_is_one_the_release_builds.py +309 -0
- openfactory-0.2.0/tests/test_every_mutation_plan_can_run.py +180 -0
- openfactory-0.2.0/tests/test_factory_asks_for_help.py +377 -0
- openfactory-0.2.0/tests/test_filed_work_is_reachable.py +150 -0
- openfactory-0.2.0/tests/test_first_real_conversation.py +172 -0
- openfactory-0.2.0/tests/test_forge_ci.py +48 -0
- openfactory-0.2.0/tests/test_forge_deploy.py +70 -0
- openfactory-0.2.0/tests/test_forge_idempotency.py +102 -0
- openfactory-0.2.0/tests/test_foundation.py +93 -0
- openfactory-0.2.0/tests/test_gh_is_authenticated.py +127 -0
- openfactory-0.2.0/tests/test_handoff.py +140 -0
- openfactory-0.2.0/tests/test_init_asks_for_one_machine.py +128 -0
- openfactory-0.2.0/tests/test_init_generates_the_deployment.py +358 -0
- openfactory-0.2.0/tests/test_init_speaks_to_the_operator_not_to_us.py +69 -0
- openfactory-0.2.0/tests/test_init_that_acts.py +175 -0
- openfactory-0.2.0/tests/test_internal_imports_resolve.py +159 -0
- openfactory-0.2.0/tests/test_judge_verdict_parsing.py +227 -0
- openfactory-0.2.0/tests/test_kernel_names_no_vendor.py +265 -0
- openfactory-0.2.0/tests/test_knowledge.py +724 -0
- openfactory-0.2.0/tests/test_knowledge_build_reaches_a_factory_cloned_project.py +160 -0
- openfactory-0.2.0/tests/test_knowledge_derived_not_cached.py +138 -0
- openfactory-0.2.0/tests/test_knowledge_experiment.py +175 -0
- openfactory-0.2.0/tests/test_knowledge_pipeline.py +757 -0
- openfactory-0.2.0/tests/test_local_flow.py +54 -0
- openfactory-0.2.0/tests/test_loops_are_reachable.py +335 -0
- openfactory-0.2.0/tests/test_manifest_version.py +131 -0
- openfactory-0.2.0/tests/test_memory_ledger.py +159 -0
- openfactory-0.2.0/tests/test_memory_recall_eval.py +239 -0
- openfactory-0.2.0/tests/test_memory_store.py +118 -0
- openfactory-0.2.0/tests/test_merge_policy.py +95 -0
- openfactory-0.2.0/tests/test_metrics.py +214 -0
- openfactory-0.2.0/tests/test_no_card_id_reaches_a_stranger.py +197 -0
- openfactory-0.2.0/tests/test_no_checkout_assumes_a_branch_name.py +403 -0
- openfactory-0.2.0/tests/test_no_gesture_exists_in_one_language_only.py +278 -0
- openfactory-0.2.0/tests/test_no_module_is_ever_called_like_a_function.py +299 -0
- openfactory-0.2.0/tests/test_no_plumbing_reaches_the_client.py +129 -0
- openfactory-0.2.0/tests/test_no_silent_failures.py +199 -0
- openfactory-0.2.0/tests/test_no_unbounded_growth.py +342 -0
- openfactory-0.2.0/tests/test_non_numeric_refs_reach_the_api.py +143 -0
- openfactory-0.2.0/tests/test_nothing_speaks_before_it_asks_the_language.py +172 -0
- openfactory-0.2.0/tests/test_observability_registries.py +168 -0
- openfactory-0.2.0/tests/test_onboard_builds_the_context_too.py +264 -0
- openfactory-0.2.0/tests/test_onboard_proposes_a_measured_setup.py +302 -0
- openfactory-0.2.0/tests/test_onboarding_a_context_that_already_exists.py +155 -0
- openfactory-0.2.0/tests/test_onboarding_backfills_the_context.py +921 -0
- openfactory-0.2.0/tests/test_onboarding_creates_the_context_repository.py +268 -0
- openfactory-0.2.0/tests/test_onboarding_firstrun.py +1117 -0
- openfactory-0.2.0/tests/test_one_process_one_installation.py +376 -0
- openfactory-0.2.0/tests/test_one_question_decides_where_the_factory_runs.py +239 -0
- openfactory-0.2.0/tests/test_opencode_harness.py +472 -0
- openfactory-0.2.0/tests/test_orphaned_cards_are_repointed.py +651 -0
- openfactory-0.2.0/tests/test_panel_approval_store.py +170 -0
- openfactory-0.2.0/tests/test_panel_reads_events_without_aws.py +108 -0
- openfactory-0.2.0/tests/test_park_alert.py +75 -0
- openfactory-0.2.0/tests/test_paths_are_traversal_safe.py +153 -0
- openfactory-0.2.0/tests/test_permission_is_an_order_in_every_language.py +166 -0
- openfactory-0.2.0/tests/test_ports_are_serialisable.py +258 -0
- openfactory-0.2.0/tests/test_preflight.py +519 -0
- openfactory-0.2.0/tests/test_preflight_json_is_the_document_the_agent_lane_reads.py +158 -0
- openfactory-0.2.0/tests/test_preflight_names_a_remedy_for_every_thing_it_refuses.py +243 -0
- openfactory-0.2.0/tests/test_preflight_says_which_machine_it_measured.py +110 -0
- openfactory-0.2.0/tests/test_product_authoring.py +699 -0
- openfactory-0.2.0/tests/test_product_board_reads.py +380 -0
- openfactory-0.2.0/tests/test_product_brownfield.py +309 -0
- openfactory-0.2.0/tests/test_product_channel.py +351 -0
- openfactory-0.2.0/tests/test_product_config.py +213 -0
- openfactory-0.2.0/tests/test_product_corpus.py +260 -0
- openfactory-0.2.0/tests/test_product_followup.py +263 -0
- openfactory-0.2.0/tests/test_product_followup_e2e.py +173 -0
- openfactory-0.2.0/tests/test_product_intents.py +53 -0
- openfactory-0.2.0/tests/test_product_loader.py +213 -0
- openfactory-0.2.0/tests/test_product_module.py +324 -0
- openfactory-0.2.0/tests/test_product_needs_action.py +368 -0
- openfactory-0.2.0/tests/test_product_role.py +211 -0
- openfactory-0.2.0/tests/test_product_sees_the_code.py +121 -0
- openfactory-0.2.0/tests/test_product_simulation.py +570 -0
- openfactory-0.2.0/tests/test_product_sweep.py +249 -0
- openfactory-0.2.0/tests/test_product_triage.py +198 -0
- openfactory-0.2.0/tests/test_product_view_is_stable.py +138 -0
- openfactory-0.2.0/tests/test_product_voice.py +359 -0
- openfactory-0.2.0/tests/test_product_workspace.py +125 -0
- openfactory-0.2.0/tests/test_project_add_exposes_language.py +54 -0
- openfactory-0.2.0/tests/test_project_add_speaks_azure_devops.py +185 -0
- openfactory-0.2.0/tests/test_promotion.py +231 -0
- openfactory-0.2.0/tests/test_provider_seams.py +312 -0
- openfactory-0.2.0/tests/test_public_core_names_no_forge.py +951 -0
- openfactory-0.2.0/tests/test_recent_runs_outlives_the_engine.py +208 -0
- openfactory-0.2.0/tests/test_registry_is_runtime_state.py +235 -0
- openfactory-0.2.0/tests/test_repo_cache_credentials.py +151 -0
- openfactory-0.2.0/tests/test_repo_cache_lifecycle.py +163 -0
- openfactory-0.2.0/tests/test_requirement_can_be_dropped.py +575 -0
- openfactory-0.2.0/tests/test_requirement_lifecycle.py +874 -0
- openfactory-0.2.0/tests/test_sandbox_registry.py +158 -0
- openfactory-0.2.0/tests/test_scheduler.py +89 -0
- openfactory-0.2.0/tests/test_schedules_are_reachable.py +151 -0
- openfactory-0.2.0/tests/test_somebody_is_asked_to_look_at_what_shipped.py +343 -0
- openfactory-0.2.0/tests/test_sqlite_metrics.py +314 -0
- openfactory-0.2.0/tests/test_sso_is_a_row_the_core_ships.py +662 -0
- openfactory-0.2.0/tests/test_sweep_client_surface.py +732 -0
- openfactory-0.2.0/tests/test_sweep_records_only_what_posted.py +513 -0
- openfactory-0.2.0/tests/test_techlead_classify.py +354 -0
- openfactory-0.2.0/tests/test_techlead_memory.py +266 -0
- openfactory-0.2.0/tests/test_techlead_self_heal.py +107 -0
- openfactory-0.2.0/tests/test_techlead_watch.py +431 -0
- openfactory-0.2.0/tests/test_telemetry_reads_from_the_configured_sink.py +187 -0
- openfactory-0.2.0/tests/test_temporal_call_arity.py +92 -0
- openfactory-0.2.0/tests/test_temporal_view.py +280 -0
- openfactory-0.2.0/tests/test_temporal_workflow.py +1768 -0
- openfactory-0.2.0/tests/test_the_acceptance_map_reaches_a_person.py +229 -0
- openfactory-0.2.0/tests/test_the_action_layer.py +1592 -0
- openfactory-0.2.0/tests/test_the_add_on_packages_install.py +206 -0
- openfactory-0.2.0/tests/test_the_ado_board.py +876 -0
- openfactory-0.2.0/tests/test_the_ado_coordinates_have_one_home.py +134 -0
- openfactory-0.2.0/tests/test_the_ado_credential_outlives_one_token.py +293 -0
- openfactory-0.2.0/tests/test_the_ado_forge.py +897 -0
- openfactory-0.2.0/tests/test_the_ado_pipelines.py +573 -0
- openfactory-0.2.0/tests/test_the_ado_tracker.py +742 -0
- openfactory-0.2.0/tests/test_the_alert_names_its_ticket_on_any_tracker.py +60 -0
- openfactory-0.2.0/tests/test_the_announcement_carries_the_verdict.py +139 -0
- openfactory-0.2.0/tests/test_the_app_key_reaches_every_entry_point.py +139 -0
- openfactory-0.2.0/tests/test_the_app_permission_table_has_one_home.py +58 -0
- openfactory-0.2.0/tests/test_the_areas_that_change_are_the_ones_that_matter.py +273 -0
- openfactory-0.2.0/tests/test_the_backfill_is_metered.py +243 -0
- openfactory-0.2.0/tests/test_the_backfill_names_the_real_reason.py +199 -0
- openfactory-0.2.0/tests/test_the_backfill_reads_every_source.py +235 -0
- openfactory-0.2.0/tests/test_the_backfills_questions_can_be_finished.py +392 -0
- openfactory-0.2.0/tests/test_the_base_branch_is_asked_not_assumed.py +258 -0
- openfactory-0.2.0/tests/test_the_bench_is_not_the_case.py +120 -0
- openfactory-0.2.0/tests/test_the_board_is_a_page_on_the_panel.py +293 -0
- openfactory-0.2.0/tests/test_the_board_lives_in_one_file.py +513 -0
- openfactory-0.2.0/tests/test_the_board_names_its_own_pickup_column.py +97 -0
- openfactory-0.2.0/tests/test_the_board_port_takes_any_providers_ref.py +205 -0
- openfactory-0.2.0/tests/test_the_board_says_where_it_lives.py +355 -0
- openfactory-0.2.0/tests/test_the_box_can_obtain_the_repository.py +217 -0
- openfactory-0.2.0/tests/test_the_box_can_reach_the_pr_branch.py +177 -0
- openfactory-0.2.0/tests/test_the_box_claims_only_what_it_does.py +252 -0
- openfactory-0.2.0/tests/test_the_box_clones_from_the_forge_it_was_told.py +206 -0
- openfactory-0.2.0/tests/test_the_box_does_not_run_the_clients_shell_profile.py +115 -0
- openfactory-0.2.0/tests/test_the_box_env_is_a_named_seam.py +88 -0
- openfactory-0.2.0/tests/test_the_box_image_resolves_in_one_place.py +317 -0
- openfactory-0.2.0/tests/test_the_box_image_the_worker_spawns_is_one_the_install_pulls.py +193 -0
- openfactory-0.2.0/tests/test_the_box_program_can_be_launched.py +93 -0
- openfactory-0.2.0/tests/test_the_box_proof_is_watchable.py +201 -0
- openfactory-0.2.0/tests/test_the_box_says_where_the_harness_is.py +181 -0
- openfactory-0.2.0/tests/test_the_box_transmits_while_it_runs.py +477 -0
- openfactory-0.2.0/tests/test_the_boxed_job_entrypoint.py +191 -0
- openfactory-0.2.0/tests/test_the_branch_carries_the_products_name.py +240 -0
- openfactory-0.2.0/tests/test_the_button_without_a_gate.py +114 -0
- openfactory-0.2.0/tests/test_the_card_carries_ONE_acceptance_section.py +85 -0
- openfactory-0.2.0/tests/test_the_card_moves_even_when_the_link_cannot_be_built.py +93 -0
- openfactory-0.2.0/tests/test_the_card_says_what_the_floor_says.py +162 -0
- openfactory-0.2.0/tests/test_the_chat_has_its_own_fences.py +261 -0
- openfactory-0.2.0/tests/test_the_chat_is_a_directory_delete.py +440 -0
- openfactory-0.2.0/tests/test_the_chat_thread_survives_a_refresh.py +173 -0
- openfactory-0.2.0/tests/test_the_ci_is_read_more_than_once.py +361 -0
- openfactory-0.2.0/tests/test_the_cli_refuses_in_sentences.py +264 -0
- openfactory-0.2.0/tests/test_the_cli_runs_in_the_deployments_box.py +150 -0
- openfactory-0.2.0/tests/test_the_client_never_reads_an_emoji.py +141 -0
- openfactory-0.2.0/tests/test_the_client_releases_production.py +307 -0
- openfactory-0.2.0/tests/test_the_cloud_is_a_directory_delete.py +1443 -0
- openfactory-0.2.0/tests/test_the_columns_and_the_identity_are_the_platforms.py +241 -0
- openfactory-0.2.0/tests/test_the_compose_file_can_be_installed_and_built_from_one_file.py +242 -0
- openfactory-0.2.0/tests/test_the_confirmation_executor.py +550 -0
- openfactory-0.2.0/tests/test_the_context_proposal_is_reachable.py +274 -0
- openfactory-0.2.0/tests/test_the_context_repository_can_be_created.py +174 -0
- openfactory-0.2.0/tests/test_the_context_repository_exists_on_this_runtime.py +177 -0
- openfactory-0.2.0/tests/test_the_core_addon_ledger.py +363 -0
- openfactory-0.2.0/tests/test_the_core_boundary.py +215 -0
- openfactory-0.2.0/tests/test_the_core_does_not_need_a_cloud.py +209 -0
- openfactory-0.2.0/tests/test_the_core_is_a_core.py +194 -0
- openfactory-0.2.0/tests/test_the_credential_scan_reads_a_delimiter.py +229 -0
- openfactory-0.2.0/tests/test_the_default_language_is_the_products.py +155 -0
- openfactory-0.2.0/tests/test_the_deployment_asks_the_rows_for_their_variables.py +214 -0
- openfactory-0.2.0/tests/test_the_diff_decides_scope_and_what_validates.py +234 -0
- openfactory-0.2.0/tests/test_the_distribution_ships_what_it_tells_you_to_copy.py +72 -0
- openfactory-0.2.0/tests/test_the_docs_do_not_drift.py +727 -0
- openfactory-0.2.0/tests/test_the_docs_name_no_vendor_as_the_core.py +275 -0
- openfactory-0.2.0/tests/test_the_docs_say_which_promise.py +89 -0
- openfactory-0.2.0/tests/test_the_doctor_says_where_project_less_speech_goes.py +269 -0
- openfactory-0.2.0/tests/test_the_doctor_survives_its_own_probes.py +349 -0
- openfactory-0.2.0/tests/test_the_doctor_tells_the_truth_about_this_machine.py +204 -0
- openfactory-0.2.0/tests/test_the_documentation_has_one_front_door.py +106 -0
- openfactory-0.2.0/tests/test_the_documented_default_is_the_real_one.py +132 -0
- openfactory-0.2.0/tests/test_the_documents_describe_the_product_this_tree_is.py +899 -0
- openfactory-0.2.0/tests/test_the_documents_name_the_repository_and_keep_their_accents.py +158 -0
- openfactory-0.2.0/tests/test_the_doors_derive_from_the_registries.py +963 -0
- openfactory-0.2.0/tests/test_the_end_to_end_install_is_a_script_the_suite_can_run.py +451 -0
- openfactory-0.2.0/tests/test_the_engine_dying_under_a_job_is_not_a_mystery.py +190 -0
- openfactory-0.2.0/tests/test_the_environment_carries_the_products_name.py +538 -0
- openfactory-0.2.0/tests/test_the_environment_round_is_a_terminal_verb.py +129 -0
- openfactory-0.2.0/tests/test_the_event_axis_is_reached.py +101 -0
- openfactory-0.2.0/tests/test_the_examples_a_reader_copies_load_on_the_core.py +513 -0
- openfactory-0.2.0/tests/test_the_extensibility_doc_names_the_real_group.py +172 -0
- openfactory-0.2.0/tests/test_the_factory_asks_before_it_starts.py +459 -0
- openfactory-0.2.0/tests/test_the_factory_authors_what_it_does_not_know_before_it_changes_it.py +251 -0
- openfactory-0.2.0/tests/test_the_factory_runs_on_one_machine.py +282 -0
- openfactory-0.2.0/tests/test_the_factory_runs_without_a_cloud.py +174 -0
- openfactory-0.2.0/tests/test_the_facts_are_files_the_techlead_can_open.py +296 -0
- openfactory-0.2.0/tests/test_the_facts_stay_files_for_every_harness.py +71 -0
- openfactory-0.2.0/tests/test_the_first_hour_fails_by_name.py +219 -0
- openfactory-0.2.0/tests/test_the_first_round_is_reachable.py +182 -0
- openfactory-0.2.0/tests/test_the_first_yes_writes_and_the_second_yes_is_on_the_ticket.py +266 -0
- openfactory-0.2.0/tests/test_the_floor_and_the_inbox_agree.py +194 -0
- openfactory-0.2.0/tests/test_the_floor_is_a_deployment_default_not_a_transcription.py +530 -0
- openfactory-0.2.0/tests/test_the_floor_is_a_platform_capability.py +722 -0
- openfactory-0.2.0/tests/test_the_floor_is_enforced_where_the_money_is.py +309 -0
- openfactory-0.2.0/tests/test_the_forge_can_read_a_foreign_repository.py +526 -0
- openfactory-0.2.0/tests/test_the_forge_credential_is_per_project.py +198 -0
- openfactory-0.2.0/tests/test_the_forge_opens_a_pr_in_another_repository.py +371 -0
- openfactory-0.2.0/tests/test_the_form_asks_what_the_address_needs.py +200 -0
- openfactory-0.2.0/tests/test_the_gate_checks_the_shell_script_a_stranger_runs_first.py +311 -0
- openfactory-0.2.0/tests/test_the_gate_shows_what_the_review_found.py +168 -0
- openfactory-0.2.0/tests/test_the_generated_environment_names_a_work_directory_that_needs_no_root.py +299 -0
- openfactory-0.2.0/tests/test_the_harness_endpoint_is_the_clients.py +267 -0
- openfactory-0.2.0/tests/test_the_harness_is_watched_while_it_runs.py +431 -0
- openfactory-0.2.0/tests/test_the_harness_pulse.py +582 -0
- openfactory-0.2.0/tests/test_the_history_says_where_the_work_is.py +556 -0
- openfactory-0.2.0/tests/test_the_install_line_the_readme_prints_is_the_url_the_release_publishes_to.py +165 -0
- openfactory-0.2.0/tests/test_the_installer_builds_the_commands_it_says_it_does.py +494 -0
- openfactory-0.2.0/tests/test_the_installer_knows_exactly_two_facts_the_package_does_not.py +137 -0
- openfactory-0.2.0/tests/test_the_installer_never_calls_sudo.py +198 -0
- openfactory-0.2.0/tests/test_the_installer_pins_a_version_and_never_installs_a_floating_tag.py +160 -0
- openfactory-0.2.0/tests/test_the_inventory_counts_what_it_could_not_place.py +375 -0
- openfactory-0.2.0/tests/test_the_journal_is_where_the_deployment_says.py +216 -0
- openfactory-0.2.0/tests/test_the_journal_records_how_a_job_ENDED.py +203 -0
- openfactory-0.2.0/tests/test_the_judging_roles_can_reach_their_model.py +201 -0
- openfactory-0.2.0/tests/test_the_language_reaches_every_unprompted_surface.py +149 -0
- openfactory-0.2.0/tests/test_the_lifecycle_names_no_provider.py +219 -0
- openfactory-0.2.0/tests/test_the_loop_tells_the_truth.py +246 -0
- openfactory-0.2.0/tests/test_the_manifest_can_be_proposed_server_side.py +279 -0
- openfactory-0.2.0/tests/test_the_manifest_reference_is_complete.py +100 -0
- openfactory-0.2.0/tests/test_the_map_does_not_wait_for_a_merge.py +167 -0
- openfactory-0.2.0/tests/test_the_map_is_published_beside_the_concepts.py +169 -0
- openfactory-0.2.0/tests/test_the_map_says_what_it_does_not_cover.py +198 -0
- openfactory-0.2.0/tests/test_the_merge_is_the_end_of_the_road.py +252 -0
- openfactory-0.2.0/tests/test_the_merge_re_authors_what_it_invalidated.py +446 -0
- openfactory-0.2.0/tests/test_the_model_is_a_per_project_choice.py +398 -0
- openfactory-0.2.0/tests/test_the_model_is_set_from_the_cli.py +90 -0
- openfactory-0.2.0/tests/test_the_mutation_runner_is_not_decoration.py +328 -0
- openfactory-0.2.0/tests/test_the_namespace_is_the_products_name.py +395 -0
- openfactory-0.2.0/tests/test_the_net_that_protects_the_client.py +197 -0
- openfactory-0.2.0/tests/test_the_number_told_is_the_number_written.py +151 -0
- openfactory-0.2.0/tests/test_the_one_machine_deployment_runs_unattended.py +180 -0
- openfactory-0.2.0/tests/test_the_open_distribution_has_a_voice.py +114 -0
- openfactory-0.2.0/tests/test_the_operator_hears_the_projects_language.py +207 -0
- openfactory-0.2.0/tests/test_the_operator_path_names_what_the_code_mints.py +390 -0
- openfactory-0.2.0/tests/test_the_oss_distribution.py +505 -0
- openfactory-0.2.0/tests/test_the_panel_is_a_channel.py +651 -0
- openfactory-0.2.0/tests/test_the_panel_is_pushed_to.py +301 -0
- openfactory-0.2.0/tests/test_the_panel_names_no_vendor.py +73 -0
- openfactory-0.2.0/tests/test_the_panel_reads_as_a_control_room.py +293 -0
- openfactory-0.2.0/tests/test_the_panel_says_a_pass_is_running.py +106 -0
- openfactory-0.2.0/tests/test_the_panel_says_where_to_change_things.py +138 -0
- openfactory-0.2.0/tests/test_the_panel_says_whether_work_is_picked_up.py +290 -0
- openfactory-0.2.0/tests/test_the_panel_says_which_harness.py +235 -0
- openfactory-0.2.0/tests/test_the_panel_speaks_one_language.py +179 -0
- openfactory-0.2.0/tests/test_the_panel_touches_no_cloud_locally.py +198 -0
- openfactory-0.2.0/tests/test_the_platform_reads_a_repository_and_proposes.py +1079 -0
- openfactory-0.2.0/tests/test_the_product_carries_no_ones_past.py +457 -0
- openfactory-0.2.0/tests/test_the_product_carries_no_owners_name.py +660 -0
- openfactory-0.2.0/tests/test_the_product_conversation_is_core.py +969 -0
- openfactory-0.2.0/tests/test_the_product_owner_opens_a_card_as_described.py +348 -0
- openfactory-0.2.0/tests/test_the_product_owner_orders_the_backlog_from_chat.py +182 -0
- openfactory-0.2.0/tests/test_the_product_owner_reads_an_intake_and_teaches.py +242 -0
- openfactory-0.2.0/tests/test_the_product_owner_writes_the_backlog_order.py +421 -0
- openfactory-0.2.0/tests/test_the_product_owners_facts_are_files.py +267 -0
- openfactory-0.2.0/tests/test_the_product_path_is_not_github_by_construction.py +809 -0
- openfactory-0.2.0/tests/test_the_product_role_lives_outside_slack.py +2149 -0
- openfactory-0.2.0/tests/test_the_product_role_speaks_the_clients_language.py +156 -0
- openfactory-0.2.0/tests/test_the_project_remembers_what_everyone_said.py +320 -0
- openfactory-0.2.0/tests/test_the_promotion_tail_speaks.py +120 -0
- openfactory-0.2.0/tests/test_the_proof_gates_each_repository.py +268 -0
- openfactory-0.2.0/tests/test_the_proof_gates_pickup.py +461 -0
- openfactory-0.2.0/tests/test_the_proof_on_the_host.py +223 -0
- openfactory-0.2.0/tests/test_the_proposal_covers_the_floor.py +268 -0
- openfactory-0.2.0/tests/test_the_public_cut_is_written_down.py +1232 -0
- openfactory-0.2.0/tests/test_the_public_documents_serve_a_stranger.py +745 -0
- openfactory-0.2.0/tests/test_the_pull_request_lives_in_the_file.py +401 -0
- openfactory-0.2.0/tests/test_the_pull_request_says_what_the_card_says.py +463 -0
- openfactory-0.2.0/tests/test_the_queue_proposes_in_batches.py +342 -0
- openfactory-0.2.0/tests/test_the_reading_is_bound_against_the_bundle_that_exists.py +109 -0
- openfactory-0.2.0/tests/test_the_release_assembles_what_the_installer_downloads.py +196 -0
- openfactory-0.2.0/tests/test_the_remedy_a_refusal_hands_you_can_be_followed.py +341 -0
- openfactory-0.2.0/tests/test_the_renewal_keeps_the_inventory_current.py +135 -0
- openfactory-0.2.0/tests/test_the_repository_moves_to_the_ticket.py +499 -0
- openfactory-0.2.0/tests/test_the_review_findings_stay_fixed.py +747 -0
- openfactory-0.2.0/tests/test_the_reviewer_can_actually_run.py +70 -0
- openfactory-0.2.0/tests/test_the_role_does_not_claim_blindness.py +97 -0
- openfactory-0.2.0/tests/test_the_roles_can_reach_the_bundle.py +394 -0
- openfactory-0.2.0/tests/test_the_roles_run_on_the_local_rows.py +213 -0
- openfactory-0.2.0/tests/test_the_second_deployment_is_not_the_first.py +259 -0
- openfactory-0.2.0/tests/test_the_second_yes_is_the_requesters.py +207 -0
- openfactory-0.2.0/tests/test_the_security_policy_promises_what_the_scrub_does.py +120 -0
- openfactory-0.2.0/tests/test_the_sizer_names_the_area_it_expects_to_touch.py +48 -0
- openfactory-0.2.0/tests/test_the_socket_is_real_and_scoped.py +295 -0
- openfactory-0.2.0/tests/test_the_split_says_which_card_to_drag.py +135 -0
- openfactory-0.2.0/tests/test_the_starter_template_passes_its_own_floor.py +68 -0
- openfactory-0.2.0/tests/test_the_station_strip_resets_on_a_re_run.py +74 -0
- openfactory-0.2.0/tests/test_the_stock_box_runs_what_the_proposer_proposes.py +75 -0
- openfactory-0.2.0/tests/test_the_structural_documents_speak_the_projects_portuguese.py +111 -0
- openfactory-0.2.0/tests/test_the_suite_cannot_reach_a_live_engine.py +217 -0
- openfactory-0.2.0/tests/test_the_suite_cannot_reach_production.py +140 -0
- openfactory-0.2.0/tests/test_the_techlead_answers_without_a_channel.py +417 -0
- openfactory-0.2.0/tests/test_the_techlead_can_see_the_change_it_judges.py +286 -0
- openfactory-0.2.0/tests/test_the_techlead_can_see_what_it_reasons_about.py +438 -0
- openfactory-0.2.0/tests/test_the_techlead_does_not_cry_wolf.py +255 -0
- openfactory-0.2.0/tests/test_the_techlead_reads_through_the_ports.py +1217 -0
- openfactory-0.2.0/tests/test_the_techlead_remembers_the_conversation.py +276 -0
- openfactory-0.2.0/tests/test_the_techlead_sees_a_jira_floor.py +201 -0
- openfactory-0.2.0/tests/test_the_ticket_url_is_the_trackers_own.py +112 -0
- openfactory-0.2.0/tests/test_the_toolbox.py +319 -0
- openfactory-0.2.0/tests/test_the_tracker_has_a_read_side.py +1007 -0
- openfactory-0.2.0/tests/test_the_tracker_reads_what_a_person_wrote.py +226 -0
- openfactory-0.2.0/tests/test_the_trajectory_is_a_measurement.py +281 -0
- openfactory-0.2.0/tests/test_the_trajectory_reaches_the_record.py +224 -0
- openfactory-0.2.0/tests/test_the_two_halves_agree_on_which_code_they_run.py +350 -0
- openfactory-0.2.0/tests/test_the_vendors_credential_is_found_by_default.py +116 -0
- openfactory-0.2.0/tests/test_the_verifier_is_not_editable_by_what_it_verifies.py +405 -0
- openfactory-0.2.0/tests/test_the_walk_respects_what_the_repository_ignores.py +178 -0
- openfactory-0.2.0/tests/test_the_web_conversation_is_directed_at_the_person_in_it.py +228 -0
- openfactory-0.2.0/tests/test_the_web_offers_the_room_and_the_private_chat.py +259 -0
- openfactory-0.2.0/tests/test_the_wheel_is_published_under_the_name_the_docs_tell_you_to_install.py +319 -0
- openfactory-0.2.0/tests/test_the_wheel_ships_what_the_platform_needs.py +250 -0
- openfactory-0.2.0/tests/test_the_word_list_is_a_shortcut_not_a_gate.py +251 -0
- openfactory-0.2.0/tests/test_three_commands_one_verdict.py +1080 -0
- openfactory-0.2.0/tests/test_token_provider.py +24 -0
- openfactory-0.2.0/tests/test_tracker_board_writes.py +561 -0
- openfactory-0.2.0/tests/test_tracker_is_vendor_neutral.py +315 -0
- openfactory-0.2.0/tests/test_transcript_memory.py +407 -0
- openfactory-0.2.0/tests/test_two_projects_do_not_share_a_box.py +394 -0
- openfactory-0.2.0/tests/test_voice_vocabulary.py +238 -0
- openfactory-0.2.0/tests/test_walking_skeleton.py +1842 -0
- openfactory-0.2.0/tests/test_what_git_refuses_the_person_reads.py +312 -0
- openfactory-0.2.0/tests/test_who_is_asking.py +370 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "{}"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2026 The OpenFactory Authors
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
|
202
|
+
|
openfactory-0.2.0/NOTICE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
OpenFactory
|
|
2
|
+
https://openfactory.digital
|
|
3
|
+
|
|
4
|
+
Copyright 2026 The OpenFactory Authors
|
|
5
|
+
|
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License"); see LICENSE.
|
|
7
|
+
|
|
8
|
+
THE CODE IS FREE; THE NAME IS NOT.
|
|
9
|
+
|
|
10
|
+
Apache-2.0 grants you every right to use, modify, fork and redistribute this software,
|
|
11
|
+
including commercially. It grants no right to the "OpenFactory" name, logo or marks.
|
|
12
|
+
|
|
13
|
+
That split is deliberate and it is the whole protection strategy. A
|
|
14
|
+
restrictive licence would buy protection against a problem this project does not have —
|
|
15
|
+
a hyperscaler reselling it — at the cost of the adoption it is trying to buy. What is
|
|
16
|
+
worth defending is the mark, and the mark is only worth defending because the conformance
|
|
17
|
+
suite gives it meaning.
|
|
18
|
+
|
|
19
|
+
So: anyone may fork. Only builds that pass the published conformance suite
|
|
20
|
+
(`openfactory conformance`, `openfactory conformance-adapter`) may be called OpenFactory.
|
|
21
|
+
That is the Kubernetes mechanism — permissive licence, defended mark, conformance as the
|
|
22
|
+
gate.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: openfactory
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: A framework to run software tickets autonomously with coding agents — policies authorize actions, humans evaluate results.
|
|
5
|
+
Author: The OpenFactory Authors
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://openfactory.digital
|
|
8
|
+
Project-URL: Repository, https://github.com/Open-Factory-Digital/openfactory-core
|
|
9
|
+
Project-URL: Issues, https://github.com/Open-Factory-Digital/openfactory-core/issues
|
|
10
|
+
Keywords: sdlc,agents,automation,devops,ai
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
16
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
17
|
+
Requires-Python: >=3.12
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
License-File: NOTICE
|
|
20
|
+
Requires-Dist: pydantic>=2.7
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: typer>=0.12
|
|
23
|
+
Requires-Dist: httpx>=0.27
|
|
24
|
+
Requires-Dist: pyjwt[crypto]>=2.8
|
|
25
|
+
Requires-Dist: python-dotenv>=1.0
|
|
26
|
+
Requires-Dist: fastapi>=0.111
|
|
27
|
+
Requires-Dist: uvicorn>=0.30
|
|
28
|
+
Requires-Dist: websockets>=12
|
|
29
|
+
Provides-Extra: runtime
|
|
30
|
+
Requires-Dist: temporalio>=1.7; extra == "runtime"
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
34
|
+
Requires-Dist: bandit>=1.7; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest>=8.2; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
37
|
+
Requires-Dist: types-pyyaml; extra == "dev"
|
|
38
|
+
Requires-Dist: temporalio>=1.7; extra == "dev"
|
|
39
|
+
Requires-Dist: pytest-randomly>=3.15; extra == "dev"
|
|
40
|
+
Requires-Dist: pytest-xdist>=3.6; extra == "dev"
|
|
41
|
+
Dynamic: license-file
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# OpenFactory
|
|
2
|
+
|
|
3
|
+
**An autonomous software factory.** It takes tickets from your board and returns reviewed pull
|
|
4
|
+
requests — planned, implemented, validated by *your* test suite, independently reviewed, and
|
|
5
|
+
merged under the policy you chose. Humans stop authorising every step and start evaluating
|
|
6
|
+
results; production stays behind a human gate, always.
|
|
7
|
+
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](pyproject.toml)
|
|
10
|
+
|
|
11
|
+
It is **not a coding agent** — it orchestrates the ones you already use (Claude Code, Codex,
|
|
12
|
+
Kimi, OpenCode) behind one adapter contract. It is **not a SaaS** — it runs on your machines,
|
|
13
|
+
against your board, with your credentials, and no cloud account is required.
|
|
14
|
+
|
|
15
|
+
## Why this one
|
|
16
|
+
|
|
17
|
+
- **Policies authorise, humans evaluate.** The manifest declares the merge policy, the quality
|
|
18
|
+
floor and the promotion chain; the factory refuses vacuous green — a project with no declared
|
|
19
|
+
test command is *held*, not "passed".
|
|
20
|
+
- **The box is proven before money is spent.** `box prove` runs your own `setup:` and
|
|
21
|
+
`validate:` inside the real sandbox before any ticket is picked up. A misconfigured
|
|
22
|
+
environment is a named finding, not a burned agent pass.
|
|
23
|
+
- **Every stall speaks.** A blocked job parks with executable options for a human; a silent
|
|
24
|
+
forever-wait is treated as the platform's own defect class.
|
|
25
|
+
- **Provider axes, not provider lock-in.** Tracker, board, forge, CI observer, notifier, coding
|
|
26
|
+
agent and sandbox are independent adapters — GitHub Issues + Projects, Jira, Azure DevOps
|
|
27
|
+
(work items → Azure Repos PRs, end to end), chosen per project in a registry.
|
|
28
|
+
- **An independent review, structurally.** The reviewer can run on a *different* engine from the
|
|
29
|
+
executor, so "you did not write this code" is true by construction.
|
|
30
|
+
- **Honest docs.** What does not work is written down (`docs/STATUS.md`)
|
|
31
|
+
before you decide anything.
|
|
32
|
+
|
|
33
|
+
## Quickstart — one machine
|
|
34
|
+
|
|
35
|
+
The shortest path is your own repository and the coding agent you already pay for: **one
|
|
36
|
+
credential, no Docker, no account anywhere**. The factory branches from your repository, opens a
|
|
37
|
+
pull request in it, reviews the change and fast-forwards your base.
|
|
38
|
+
|
|
39
|
+
Prerequisites: git, Python 3.12+, and a coding agent on your PATH already signed in (`claude`,
|
|
40
|
+
`codex`, `kimi` or `opencode`).
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git clone https://github.com/Open-Factory-Digital/openfactory-core.git && cd openfactory-core
|
|
44
|
+
python3 -m venv .venv && source .venv/bin/activate # 3.12+; see docs/ONBOARDING.md §0
|
|
45
|
+
pip install -e .
|
|
46
|
+
|
|
47
|
+
openfactory init # press Enter twice: your code and your tickets live HERE
|
|
48
|
+
openfactory project init myapp ~/code/myapp # a path registers as itself — no owner, no board
|
|
49
|
+
openfactory doctor myapp # on this door, green IS the prerequisite list
|
|
50
|
+
|
|
51
|
+
openfactory act card_create -p myapp -P title="Add a health endpoint" -P body="## Objective
|
|
52
|
+
Serve 200 at /health
|
|
53
|
+
|
|
54
|
+
## Acceptance criteria
|
|
55
|
+
- GET /health returns 200"
|
|
56
|
+
openfactory act card_move -p myapp -i 1 -P column=TO-DO
|
|
57
|
+
openfactory poll myapp # one card, all the way to Done
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`openfactory panel` serves the same thing in a browser at http://localhost:8787 — the Board, the
|
|
61
|
+
job, the pull request. The whole door is **[docs/setup/one-machine.md](docs/setup/one-machine.md)**,
|
|
62
|
+
including what happens to your working tree when a merge lands.
|
|
63
|
+
|
|
64
|
+
## Quickstart — with Docker, on a hosted forge
|
|
65
|
+
|
|
66
|
+
The other door: the compose stack, a real forge and a real board, several people watching the same
|
|
67
|
+
panel. **Two credentials are irreducible here** — the coding agent's
|
|
68
|
+
(`CLAUDE_CODE_OAUTH_TOKEN` from `claude setup-token`, or `ANTHROPIC_API_KEY`) and a forge
|
|
69
|
+
credential (a PAT to try things out, a GitHub App for real use). Docker is asked for at this hour,
|
|
70
|
+
not before.
|
|
71
|
+
|
|
72
|
+
**Docker. Only Docker.** No Python on the host, no `sudo`, one line:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
curl -fsSL https://openfactory.digital/install.sh | sh
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
| | |
|
|
79
|
+
|---|---|
|
|
80
|
+
| **read it first** | `curl -fsSL https://openfactory.digital/install.sh -o install.sh && less install.sh && sh install.sh` |
|
|
81
|
+
| **no script at all** | the four commands below |
|
|
82
|
+
|
|
83
|
+
> The worker mounts the host's Docker socket — that is how `sandbox: container` starts a box, and
|
|
84
|
+
> it is root-equivalent on the host. It is the same trade `docker compose up` has always made here.
|
|
85
|
+
|
|
86
|
+
> The installer sends nothing anywhere. There is no telemetry in this project.
|
|
87
|
+
|
|
88
|
+
Re-running the installer is the upgrade path: it resolves the newest release, pulls it, and
|
|
89
|
+
restarts the stack. Your answers and your data survive it.
|
|
90
|
+
|
|
91
|
+
<a id="the-un-piped-equivalent"></a>
|
|
92
|
+
Prefer to do it by hand? These are the same four steps, and nothing else:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
REPO=https://github.com/Open-Factory-Digital/openfactory-core
|
|
96
|
+
VERSION=$(curl -fsSLI -o /dev/null -w '%{url_effective}' $REPO/releases/latest); VERSION=${VERSION##*/tag/}
|
|
97
|
+
curl -fsSL $REPO/releases/download/$VERSION/docker-compose.yml -o docker-compose.yml
|
|
98
|
+
curl -fsSL $REPO/releases/download/$VERSION/SHA256SUMS | sha256sum -c --ignore-missing
|
|
99
|
+
docker run --rm -it -v "$PWD:/out" -u "$(id -u):$(id -g)" \
|
|
100
|
+
ghcr.io/open-factory-digital/openfactory-cli:$VERSION init --out /out/.env.compose
|
|
101
|
+
echo "OPENFACTORY_VERSION=$VERSION" >> .env.compose
|
|
102
|
+
docker pull ghcr.io/open-factory-digital/openfactory-sandbox:$VERSION
|
|
103
|
+
docker compose --env-file .env.compose up -d
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Three of those lines look optional and are not. The **version is resolved once** and written into
|
|
107
|
+
`.env.compose`, because `docker-compose.yml` defaults to `main` — right for a contributor working
|
|
108
|
+
on the branch, wrong for anybody running a factory. The **box image is pulled by hand** because
|
|
109
|
+
`docker compose up` does not fetch it: the worker launches it as a sibling container on your own
|
|
110
|
+
daemon. And the **checksums are verified**, which is why the files come from the release rather
|
|
111
|
+
than from the website — a static host can serve a file and cannot checksum one.
|
|
112
|
+
|
|
113
|
+
Then open http://localhost:8787 in a browser — the panel (8080 is the engine's own UI).
|
|
114
|
+
|
|
115
|
+
**Two credentials are irreducible for a real ticket** — the coding agent's
|
|
116
|
+
(`CLAUDE_CODE_OAUTH_TOKEN` from `claude setup-token`, or `ANTHROPIC_API_KEY`) and a forge
|
|
117
|
+
credential (a PAT to try things out, a GitHub App for real use). `openfactory init` asks for
|
|
118
|
+
neither and names both; only the agent's cannot be postponed past the first hour.
|
|
119
|
+
|
|
120
|
+
`openfactory preflight` says what is still missing on this machine, one line each with a remedy.
|
|
121
|
+
|
|
122
|
+
Register a project **inside the worker** (the compose stack has its own registry; a
|
|
123
|
+
laptop-registered project is invisible to it). One command registers it and creates the board
|
|
124
|
+
with the platform's columns:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
docker compose --env-file .env.compose exec worker \
|
|
128
|
+
openfactory project init myapp https://github.com/<owner>/myapp.git # your org or username
|
|
129
|
+
docker compose --env-file .env.compose exec worker openfactory doctor myapp
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
(`project add` is the variant for a board you already have, or for none at all. On Azure
|
|
133
|
+
DevOps, register with your `dev.azure.com` clone URL — it carries the
|
|
134
|
+
organisation/project/repository, and Azure Boards ships with the project, so there is no board
|
|
135
|
+
to create: **[docs/setup/azure-devops.md](docs/setup/azure-devops.md)**.)
|
|
136
|
+
|
|
137
|
+
`doctor` runs nine checks always and up to four more when they apply, naming every missing
|
|
138
|
+
prerequisite with its remedy — including the
|
|
139
|
+
agent credential and the forge credential. From there, the guided first hour is
|
|
140
|
+
**[docs/ONBOARDING.md](docs/ONBOARDING.md)**: the environment session that reads your repository
|
|
141
|
+
and proposes its own manifest, the box proof, a costed rehearsal on a synthetic ticket, and the
|
|
142
|
+
first real card.
|
|
143
|
+
|
|
144
|
+
## Your first ticket
|
|
145
|
+
|
|
146
|
+
An ordinary issue, in English or Portuguese:
|
|
147
|
+
|
|
148
|
+
```markdown
|
|
149
|
+
## Objective
|
|
150
|
+
Users can export their report as CSV.
|
|
151
|
+
|
|
152
|
+
## Acceptance criteria
|
|
153
|
+
- a `GET /reports/{id}/export` endpoint returns text/csv
|
|
154
|
+
- the export respects the report's current filters
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Drag it to **TO-DO**. The factory sizes it, proves the box, plans, implements, runs *your*
|
|
158
|
+
gates, opens the PR, has it independently reviewed — and with `merge_policy: human` (the
|
|
159
|
+
recommended start) waits for your merge. The panel at `:8787` shows every step live.
|
|
160
|
+
|
|
161
|
+
## The shape
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
openfactory/
|
|
165
|
+
├── contracts/ Pydantic models — the framework↔project↔agent↔board interface
|
|
166
|
+
├── registry.py the set of projects one deployment drives (add one = data, not code)
|
|
167
|
+
├── policy/ the quality floor: stack presets + org defaults + conformance
|
|
168
|
+
├── adapters/ the provider axes — a project mixes them freely; the core ships GitHub,
|
|
169
|
+
│ │ Azure DevOps and Jira on every axis below that has a vendor, and an
|
|
170
|
+
│ │ add-on package adds a kind through the `openfactory.adapters` entry points
|
|
171
|
+
│ ├── tracker/ GitHub Issues, Jira, Azure DevOps work items
|
|
172
|
+
│ ├── board/ GitHub Projects, Jira status, Azure DevOps boards
|
|
173
|
+
│ ├── forge/ GitHub, Azure Repos — branches, PRs, merges, tags
|
|
174
|
+
│ ├── environment/ CI / deploy / health, read-only — GitHub Actions, Azure Pipelines
|
|
175
|
+
│ ├── agent/ CodingAgentAdapter — Claude Code, Codex, Kimi, OpenCode
|
|
176
|
+
│ ├── reviewer/ the independent review
|
|
177
|
+
│ ├── channel/ the panel — the reference surface; a chat channel is an add-on package (openfactory-slack)
|
|
178
|
+
│ └── sandbox/ container = real; worktree = local/test; a cloud box is an add-on package (openfactory-aws)
|
|
179
|
+
├── orchestrator/ the deterministic state machine (the spine)
|
|
180
|
+
├── runtime/ the durable engine (Temporal): poller, jobs, promotion tail
|
|
181
|
+
└── cli.py `openfactory` — project-first commands
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## The roles you can switch on
|
|
185
|
+
|
|
186
|
+
| role | what it is | where it lives |
|
|
187
|
+
|---|---|---|
|
|
188
|
+
| **engineering loop** | ticket → reviewed PR → merge | on by default; this README |
|
|
189
|
+
| **post-merge** | watch your deploy, walk your stages, gate production | opt-in per project — [ONBOARDING §13](docs/ONBOARDING.md) says what silence means |
|
|
190
|
+
| **tech-lead** | diagnoses parked jobs, proposes the fix, acts on your yes | the panel; a chat channel such as Slack is an add-on package (openfactory-slack), never a prerequisite |
|
|
191
|
+
| **product owner** | requirements as reviewed docs in a context repo; accept/queue/release | `/product/<name>` on the panel — [docs/reference/product-role.md](docs/reference/product-role.md) |
|
|
192
|
+
| **release gate** | production is approved by a named human with a password, always | [docs/reference/product-role.md §3](docs/reference/product-role.md) |
|
|
193
|
+
|
|
194
|
+
## Documentation
|
|
195
|
+
|
|
196
|
+
**One path, three references.** The map is [docs/README.md](docs/README.md); this is the short
|
|
197
|
+
form:
|
|
198
|
+
|
|
199
|
+
| read this | when |
|
|
200
|
+
|---|---|
|
|
201
|
+
| [docs/ONBOARDING.md](docs/ONBOARDING.md) | **start here** — the whole guided session on your own codebase, and the only onboarding there is |
|
|
202
|
+
| [docs/setup/one-machine.md](docs/setup/one-machine.md) | one repository, one terminal, one credential — the door that needs no account anywhere |
|
|
203
|
+
| [docs/setup/github.md](docs/setup/github.md) | the path sends you here for GitHub: the App screen by screen, a personal account's board token, a board by hand |
|
|
204
|
+
| [docs/setup/azure-devops.md](docs/setup/azure-devops.md) | …or here for the all-Microsoft side: PAT scopes, board states, registration by clone URL |
|
|
205
|
+
| [docs/STATUS.md](docs/STATUS.md) | the honest read before deciding anything |
|
|
206
|
+
| [docs/reference/configuration.md](docs/reference/configuration.md) | manifest / registry / environment — who owns which setting, promotion chains |
|
|
207
|
+
| [docs/reference/cli.md](docs/reference/cli.md) | every command (the `env`/`box`/`product` surfaces are walked in ONBOARDING) |
|
|
208
|
+
| [docs/reference/product-role.md](docs/reference/product-role.md) | switching on the product owner |
|
|
209
|
+
| [docs/writing-an-addon.md](docs/writing-an-addon.md) | your deployment needs a provider the core does not ship — a row, end to end, editing nothing here |
|
|
210
|
+
| [docs/adr/](docs/adr/) | why it is built this way (49 decision records) |
|
|
211
|
+
|
|
212
|
+
## Status
|
|
213
|
+
|
|
214
|
+
Working, and honest about where. The whole loop — sizing → box proof → agent → your gates → PR
|
|
215
|
+
→ independent review → merge — has run end to end on four stacks (Python,
|
|
216
|
+
serverless TypeScript, .NET, multi-repo) against real GitHub, real Jira and real Azure DevOps.
|
|
217
|
+
The suite runs in both orders on every change and new guards are proven by mutation before they
|
|
218
|
+
count — the current size, the commit it was measured at, and everything that is NOT settled are
|
|
219
|
+
in [`docs/STATUS.md`](docs/STATUS.md), which is the one place any of those numbers live.
|
|
220
|
+
|
|
221
|
+
## Taking part
|
|
222
|
+
|
|
223
|
+
Issues and pull requests are welcome, and the bar is written down rather than implied:
|
|
224
|
+
[CONTRIBUTING.md](CONTRIBUTING.md) explains the house rules (a guard for every behaviour, a
|
|
225
|
+
mutation for every guard) and how to add a provider to an axis without touching the core.
|
|
226
|
+
**There is no CLA** — Apache-2.0 §5 already covers what you submit, and you keep the copyright
|
|
227
|
+
on what you write. Everyone taking part is held to the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
228
|
+
|
|
229
|
+
## License
|
|
230
|
+
|
|
231
|
+
[Apache-2.0](LICENSE). The [NOTICE](NOTICE) file separates the free code from the defended
|
|
232
|
+
brand. Security reports: see [SECURITY.md](SECURITY.md). Contributions: [CONTRIBUTING.md](CONTRIBUTING.md).
|