Repository navigation
Releases: nicolasmelo1/software-factory
Release list
v0.4.1
Added
- (check) record how gates were unblocked
- (L3) a gate's criteria document stays out of the queue of undone work
- (docs) generate documentation from source
Fixed
- (overlay) derive the inapplicable set from the check kind (#53)
- (init) the python schema query listed its fields out of grammar order (#43)
- (release-plz) stage every derivative the release PR produces
- (check) satisfy local CI guardrails
- (L2) compare policy direction on the options a rule actually runs under
- (init) enable and prove template rules on a fresh install
- satisfy docs lint
Other
- (release-plz) open the release PR with a GitHub App token
- automate release PRs with release-plz
- (plans) retire the two plans whose work shipped
- merge origin/main into feat/escape-log
- reseal adoption evidence after the init change
- a small README and a generated reference
- finish documentation convention
- reseal adoption evidence
- document marker syntax safely
- (plans) governing from outside, generated docs, and the archive
- (plans) a proof path named a file that does not exist
- (readme) the rule counts had drifted
- (plans) a gate records how it was unblocked
v0.4.0
sf 0.4.0 (catalog f4c2b4b783a5, 38 rules)
Enabled-rule reach is recorded in .software-factory/catalog.lock.json.
After upgrading, run sf lock in your repository:
L2.CATALOG_ONLY_TIGHTENS reports every enabled rule that got weaker
than the version you had agreed to, so an upgrade is a decision rather
than a surprise.
Rules
L0 L0.EXCEPTIONS_HAVE_ONE_HOME Error types live in one canonical module per domain
L0 L0.NO_CROSS_LAYER_IMPORT Private and generated modules are not imported across the boundary
L0 L0.ONE_ENTRYPOINT_PER_FILE One HTTP entrypoint per file
L0 L0.PERSISTENCE_STAYS_IN_REPOSITORIES Data-access calls stay in the persistence layer
L1 L1.COMMENT_STAYS_SUCCINCT A comment block stays under the line ceiling
L1 L1.COMPLEXITY_CEILING No function exceeds the cyclomatic ceiling
L1 L1.INDIRECTION_EARNS_ITS_NAME A hop that renames nothing is not a hop
L1 L1.NO_BLANKET_SUPPRESSION Every suppression names a code and a reason
L1 L1.NO_UNTYPED_ESCAPE_HATCH The untyped escape hatch is banned, and the message names the alternative
L1 L1.SKIPPED_TESTS_STATE_A_REASON A skipped or expected-to-fail test says why
L2 L2.CATALOG_ONLY_TIGHTENS A released rule never gets weaker than the version this repository locked
L2 L2.DEPENDENCIES_CHANGE_DELIBERATELY Dependency manifests move only with an explicit lock update
L2 L2.DERIVED_ARTIFACTS_MATCH_THEIR_SOURCE Regenerating the derived artifacts changes nothing
L2 L2.FACTORY_CONFIG_IS_LOCKED The guardrail's own configuration is hash-locked
L2 L2.GENERATED_FILES_ARE_LOCKED Generated artifacts are hash-locked and not hand-edited
L2 L2.NO_PERMANENT_EXCEPTION Every frozen exception carries a future review date
L2 L2.POLICY_ONLY_TIGHTENS The guardrail may be strengthened, never quietly weakened
L3 L3.GATE_COVERS_THE_PLAN A gate requires every check its plan's criteria name, and cannot require nothing
L3 L3.GATE_HAS_FRESH_EVIDENCE A gate activated by touched paths needs digest-verified, non-stale evidence
L4 L4.CLAIM_CITES_ITS_EVIDENCE Every marked promise names the gate that proves it
L4 L4.DOC_LINKS_RESOLVE Repo-relative documentation links resolve
L4 L4.EVERY_RULE_HAS_A_WHY Every enabled rule is cited in prose, and every citation resolves
L4 L4.PLAN_CRITERION_NAMES_ITS_CHECK Every acceptance criterion names the check that proves it
L4 L4.PLAN_DECLARES_EXIT_CONDITION Every plan declares its exit condition and sits in the execution order
L4 L4.PLAN_PROOF_BUDGET A plan has a criterion floor and a bounded proof-debt budget
L4 L4.ROOT_FILES_ARE_DECLARED New top-level files are declared before they appear
L4 L4.RULE_PROSE_NAMES_A_REAL_COMMAND Every command a rule's prose quotes is one this sf accepts
L5 L5.EVERY_CHECK_HAS_A_MUTATION_TEST Every enabled rule has a mutation that proves it fires
L5 L5.NO_INERT_RULE An enabled rule must be capable of producing a finding
L6 L6.DATA_RACES_ARE_DETECTED Concurrent code is exercised under a race detector
L6 L6.DEAD_CODE_IS_DETECTED Something detects code nothing reaches
L6 L6.DEPENDENCY_VULNERABILITIES_ARE_SCANNED Something audits dependencies for known vulnerabilities
L6 L6.INSECURE_PATTERNS_ARE_SCANNED Something scans the code for known-insecure patterns
L6 L6.NO_BLOCKING_CALL_WHILE_HOLDING_A_LOCK Nothing blocks while a lock is held
L6 L6.ONE_LOCK_AT_A_TIME A function does not acquire a second lock while holding the first
L6 L6.PERFORMANCE_REGRESSION_IS_GUARDED Something would notice the code getting slower
L6 L6.SECRETS_ARE_SCANNED Something scans for committed secrets
L6 L6.WORKFLOWS_ARE_SCANNED Something scans the CI workflows themselves
What's Changed
- docs(plans): the gate assumes a way to run the product by @nicolasmelo1 in #34
- chore(plans): retake the execution order over what shipped by @nicolasmelo1 in #35
- docs(plans): scaffolds are proven in micro-sandboxes by @nicolasmelo1 in #36
- feat(L2,L3): give gates and evidence a floor by @nicolasmelo1 in #37
- feat(L4): bound a plan's proof debt by @nicolasmelo1 in #38
- feat(L3): generate runnable gate harnesses by @nicolasmelo1 in #39
Full Changelog: v0.3.0...v0.4.0
v0.3.0
sf 0.3.0 (catalog 2d97bfc6f0df, 37 rules)
Enabled-rule reach is recorded in .software-factory/catalog.lock.json.
After upgrading, run sf lock in your repository:
L2.CATALOG_ONLY_TIGHTENS reports every enabled rule that got weaker
than the version you had agreed to, so an upgrade is a decision rather
than a surprise.
Rules
L0 L0.EXCEPTIONS_HAVE_ONE_HOME Error types live in one canonical module per domain
L0 L0.NO_CROSS_LAYER_IMPORT Private and generated modules are not imported across the boundary
L0 L0.ONE_ENTRYPOINT_PER_FILE One HTTP entrypoint per file
L0 L0.PERSISTENCE_STAYS_IN_REPOSITORIES Data-access calls stay in the persistence layer
L1 L1.COMMENT_STAYS_SUCCINCT A comment block stays under the line ceiling
L1 L1.COMPLEXITY_CEILING No function exceeds the cyclomatic ceiling
L1 L1.INDIRECTION_EARNS_ITS_NAME A hop that renames nothing is not a hop
L1 L1.NO_BLANKET_SUPPRESSION Every suppression names a code and a reason
L1 L1.NO_UNTYPED_ESCAPE_HATCH The untyped escape hatch is banned, and the message names the alternative
L1 L1.SKIPPED_TESTS_STATE_A_REASON A skipped or expected-to-fail test says why
L2 L2.CATALOG_ONLY_TIGHTENS A released rule never gets weaker than the version this repository locked
L2 L2.DEPENDENCIES_CHANGE_DELIBERATELY Dependency manifests move only with an explicit lock update
L2 L2.DERIVED_ARTIFACTS_MATCH_THEIR_SOURCE Regenerating the derived artifacts changes nothing
L2 L2.FACTORY_CONFIG_IS_LOCKED The guardrail's own configuration is hash-locked
L2 L2.GENERATED_FILES_ARE_LOCKED Generated artifacts are hash-locked and not hand-edited
L2 L2.NO_PERMANENT_EXCEPTION Every frozen exception carries a future review date
L2 L2.POLICY_ONLY_TIGHTENS The guardrail may be strengthened, never quietly weakened
L3 L3.GATE_COVERS_THE_PLAN A gate requires every check its plan's criteria name
L3 L3.GATE_HAS_FRESH_EVIDENCE A gate activated by touched paths needs digest-verified, non-stale evidence
L4 L4.CLAIM_CITES_ITS_EVIDENCE Every marked promise names the gate that proves it
L4 L4.DOC_LINKS_RESOLVE Repo-relative documentation links resolve
L4 L4.EVERY_RULE_HAS_A_WHY Every enabled rule is cited in prose, and every citation resolves
L4 L4.PLAN_CRITERION_NAMES_ITS_CHECK Every acceptance criterion names the check that proves it
L4 L4.PLAN_DECLARES_EXIT_CONDITION Every plan declares its exit condition and sits in the execution order
L4 L4.ROOT_FILES_ARE_DECLARED New top-level files are declared before they appear
L4 L4.RULE_PROSE_NAMES_A_REAL_COMMAND Every command a rule's prose quotes is one this sf accepts
L5 L5.EVERY_CHECK_HAS_A_MUTATION_TEST Every enabled rule has a mutation that proves it fires
L5 L5.NO_INERT_RULE An enabled rule must be capable of producing a finding
L6 L6.DATA_RACES_ARE_DETECTED Concurrent code is exercised under a race detector
L6 L6.DEAD_CODE_IS_DETECTED Something detects code nothing reaches
L6 L6.DEPENDENCY_VULNERABILITIES_ARE_SCANNED Something audits dependencies for known vulnerabilities
L6 L6.INSECURE_PATTERNS_ARE_SCANNED Something scans the code for known-insecure patterns
L6 L6.NO_BLOCKING_CALL_WHILE_HOLDING_A_LOCK Nothing blocks while a lock is held
L6 L6.ONE_LOCK_AT_A_TIME A function does not acquire a second lock while holding the first
L6 L6.PERFORMANCE_REGRESSION_IS_GUARDED Something would notice the code getting slower
L6 L6.SECRETS_ARE_SCANNED Something scans for committed secrets
L6 L6.WORKFLOWS_ARE_SCANNED Something scans the CI workflows themselves
What's Changed
- fix(release): publish fills an existing release instead of failing on it by @nicolasmelo1 in #24
- docs(plans): a plan bigger than its proofs by @nicolasmelo1 in #27
- fix(checks): a tool named only in a comment no longer satisfies the toolchain rules by @aryrabelo in #26
- chore(plans): retire the three plans that shipped by @nicolasmelo1 in #28
- feat(policy): rules activate on the version of the dependency they are about by @nicolasmelo1 in #29
- fix(checks): the L3 layer was inert here, and the rule for that could not see it by @nicolasmelo1 in #30
- feat(L1): a comment block stays under the line ceiling by @nicolasmelo1 in #31
- feat(L1): a hop that renames nothing is not a hop by @nicolasmelo1 in #32
- chore(release): 0.3.0 by @nicolasmelo1 in #33
Full Changelog: v0.2.0...v0.3.0
v0.2.0
sf 0.2.0 (catalog ddde87d963b7, 35 rules)
Enabled-rule reach is recorded in .software-factory/catalog.lock.json.
After upgrading, run sf lock in your repository: L2.CATALOG_ONLY_TIGHTENS
reports every enabled rule that got weaker than the version you had agreed to,
so an upgrade is a decision rather than a surprise.
Pin it: cargo install --git https://github.com/nicolasmelo1/software-factory --tag v0.2.0 --locked
or download the binary for your platform below and verify it with the .sha256 beside it.
What's Changed
- feat(L3,L4): bind a plan's acceptance criteria to the gate that proves them by @nicolasmelo1 in #1
- Bind acceptance criteria to gates, and stop the workflow from running a fork's branch name by @nicolasmelo1 in #2
- fix(report): print expected/actual independently in text output by @aryrabelo in #3
- test: prove the include_str! registries match their directories by @aryrabelo in #4
- fix(init): report local rules sf fixtures cannot scaffold by @aryrabelo in #5
- docs: document kind: command as the sanctioned extension path by @aryrabelo in #6
- docs: a contributors list nobody has to remember to update by @nicolasmelo1 in #10
- feat(L1): a skipped test says why in every language sf parses by @nicolasmelo1 in #11
- docs(plans): third-party conformance and claim drift by @nicolasmelo1 in #12
- feat(L4): rule prose may only name commands sf accepts by @nicolasmelo1 in #13
- fix(ratchet): a re-seed recomputed the deadline, not just the keys by @aryrabelo in #15
- fix(L5): NO_INERT_RULE now sees TextPattern and Complexity rules by @aryrabelo in #7
- feat(lang): add the ruby language adapter by @aryrabelo in #9
- feat(L6): Ruby joins the hazard rules by @aryrabelo in #8
- feat(L4): a marked promise names the gate that proves it by @nicolasmelo1 in #14
- fix(L1): the grain rules cover Ruby by @nicolasmelo1 in #16
- fix(init): the first
sf checkaftersf initfailed on filessf initwrote by @aryrabelo in #17 - fix(cadence): L5.NO_INERT_RULE misses a toolchain rule with the wrong languages by @aryrabelo in #20
- docs(plans): the four L0 rules assume an import statement by @aryrabelo in #18
- fix(L1): scope text_pattern forbidden entries per language by @aryrabelo in #19
- feat(release): a released rule never gets weaker than the version you locked by @nicolasmelo1 in #22
- docs(plans): the grain has a ceiling and no floor by @nicolasmelo1 in #21
- fix(release): sf check --allow-commands rewrote the locks it was checking by @nicolasmelo1 in #23
New Contributors
- @nicolasmelo1 made their first contribution in #1
- @aryrabelo made their first contribution in #3
Full Changelog: https://github.com/nicolasmelo1/software-factory/commits/v0.2.0