Skip to content

Releases: nicolasmelo1/software-factory

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 12 Sep 06:36
0c1b80e

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

Choose a tag to compare

@github-actions github-actions released this 04 Sep 18:45

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

Full Changelog: v0.3.0...v0.4.0

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 01 Sep 23:18
a8864c7

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

Choose a tag to compare

@nicolasmelo1 nicolasmelo1 released this 26 Aug 22:40
cc35d86

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 check after sf init failed on files sf init wrote 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

Full Changelog: https://github.com/nicolasmelo1/software-factory/commits/v0.2.0