ci(deps): bump actions/upload-artifact from 4 to 7#3
Closed
dependabot[bot] wants to merge 58 commits into
Closed
Conversation
A pytest plugin that runs acceptance criteria stub generation as part of the pytest lifecycle, with auto-ID assignment and generic step docstrings. Features: - plugin-configuration: custom features path via pyproject.toml [tool.beehave] - plugin-hook: stub sync runs before test collection via pytest_sessionstart - auto-id-generation: assigns @id tags to untagged Examples; CI enforcement - stub-sync: creates/updates/renames test stubs from .feature files - deprecation-sync: toggles @pytest.mark.deprecated in sync with @deprecated tag
Squash merge of v2 branch into main — see PR #3 for full details.
* chore(sync): merge upstream v6.1.20260419 + hotfix 633e701 - Add living-docs skill (C4 + glossary generation for PO at Step 5) - Add docs/c4/ and docs/post-mortem/ directory placeholders - Add scientific-research/documentation.md (entries 59-62) - Update AGENTS.md: living-docs row, filesystem structure, step/role wording - Update create-skill/SKILL.md: add living-docs to available skills table - Update implementation/SKILL.md: glossary read step, TDD prerequisite, stub template cleanup - Update verify/SKILL.md: drop Standards Summary and When to Use, simplify 6b/6d, fillable Reviewer Stance Declaration, updated Next Steps - Update git-release/SKILL.md: add Step 6 living-docs + renumber steps 6-9, add checklist item - Slim reviewer.md: remove default-hypothesis para, After APPROVED block, Available Skills * docs(readme): rewrite for clarity — tutorial-first, scannable, zero metaphor overload Based on Diátaxis (tutorial scope only), Ko et al. (answer what/why/what-deps upfront), and cognitive load principles (tables over prose). Keeps bee wordplay in the name only.
…iteria column (#7) - Display Given/When/Then steps below test path at -v verbosity - Show steps for skipped stubs at -v - Add Acceptance Criteria column to pytest-html reports (pytest-beehave[html]) - Steps suppressed for tests outside tests/features/ and when show_steps_in_terminal=false - Fix CI enforcement and features-path-config tests broken by older squash-merge - Add @bug stub-creation criterion for Rule block top-level function generation
Builds wheel and sdist, publishes to PyPI via OIDC trusted publisher, then creates a GitHub release with auto-generated notes and dist artifacts.
…aps (#8) * docs(discovery): restore and fix discovery files from v2 - discovery_journal.md: restored verbatim from v2 (was missing from main) - discovery.md: recreated from journal + feature files with corrections: * fixed session ordering (chronological: general → behavior groups → per-feature 2026-04-18 → report-steps 2026-04-19) * added missing features-dir-bootstrap synthesis block * removed stale libcst reference (never added as dependency) * removed display-version from feature list (never built, no .feature file) * clarified class-based → top-level function revision * chore(workflow): restore and fix damaged files from v2 squash-merge gaps - docs/features/discovery.md: deleted (old pre-v2 format, superseded by docs/discovery.md) - docs/architecture.md: restored from v2; appended supersede ADR for libcst (not a dep) - .opencode/agents/product-owner.md: v2 — adds Bug Handling, No-In-Progress protocol, stage terminology - .opencode/agents/software-engineer.md: v2 — adds No-In-Progress stop protocol - .opencode/skills/feature-selection/SKILL.md: v2.0 — BASELINED check location fix, PO-owns-move - .opencode/skills/scope/SKILL.md: v5.0 — 2-stage model matching AGENTS.md - .opencode/skills/scope/discovery-template.md: v2 — clean Gherkin stub format - .opencode/skills/session-workflow/SKILL.md: v4.0 — ownership table, drop gen-todo, Self-Decl as conversation output - README.md: fix function name format (<8char_hex> -> <@id>)
* docs(living-docs): update C4 and glossary after report-steps * chore(release): bump version to v3.0.20260419 — Foundational Apis
…erates bee-themed features directory
…es --beehave-sample
- Catch SystemExit from run_hatch() in pytest_configure and call pytest.exit(str(exc), returncode=1) for a clean exit instead of INTERNALERROR - Fix plugin_test.py mock so getoption returns False, preventing hatch branch from triggering and silently blocking 3 tests - Rewrite test_example_hatch_5e6f7a8b to use pytest.main() at CLI boundary, capturing stderr and asserting returncode==1 + conflicting path in output - Rewrite test_example_hatch_3c4d5e6f to use pytest.main() with stdout capture, asserting each written .feature relative path appears in output
* feat(discovery): scope example-scaffold — pytest --beehave-sample generates bee-themed features directory * feat(discovery): rename scaffold → hatch; flag --beehave-hatch replaces --beehave-sample * feat(criteria): write acceptance criteria for example-hatch * chore: move example-hatch to in-progress, begin Step 2 (Architecture) * feat(example-hatch): add architecture stubs * chore: add test-coverage task and fix implementation skill quality gate command * feat(example-hatch): implement hatch command — all 16 @id tests green * chore: step 4 REJECTED for example-hatch — 4 fixes required * chore(skills): number SE Self-Declaration 1–25 and add completeness check to reviewer * fix(example-hatch): address 4 reviewer findings from REJECTED report - Catch SystemExit from run_hatch() in pytest_configure and call pytest.exit(str(exc), returncode=1) for a clean exit instead of INTERNALERROR - Fix plugin_test.py mock so getoption returns False, preventing hatch branch from triggering and silently blocking 3 tests - Rewrite test_example_hatch_5e6f7a8b to use pytest.main() at CLI boundary, capturing stderr and asserting returncode==1 + conflicting path in output - Rewrite test_example_hatch_3c4d5e6f to use pytest.main() with stdout capture, asserting each written .feature relative path appears in output * chore: step 4 APPROVED for example-hatch — all 4 fixes verified * feat(example-hatch): accept feature at Step 5 * chore: remove hatch demo artifact from in-progress/ * chore: remove hatch demo artifact from backlog/ * chore: remove hatch demo artifact from completed/ * docs: add beehave-hatch demo section to README * chore(release): bump version to v3.1.20260419 — Generative Augochlora * ci: add tag-release workflow — auto-tag on pyproject.toml version bump merge * chore(stub-creation): remove @bug tag — stub format becomes configurable option * feat(discovery): add stub-format-config feature scope * feat(stories): write user stories for stub-format-config * feat(criteria): write acceptance criteria for stub-format-config * chore: complete step 1 for stub-format-config * chore: move stub-format-config to in-progress, begin Step 2 (Architecture) * feat(stub-format-config): add architecture stubs * feat(stub-format-config): implement @id:b2c3d4e5 — absent stub_format no error * feat(stub-format-config): implement @id:f6a7b8c9 — invalid stub_format exits non-zero * feat(stub-format-config): implement @id:a1b2c3d4 — default format is top-level functions * feat(stub-format-config): implement @id:c3d4e5f6 — explicit functions format * feat(stub-format-config): all 7 @id tests green — quality gate passed * chore: update TODO.md — all 7 @id green, ready for Step 4 review * fix(stub-format-config): address reviewer findings — cast, unit test location, idempotency * chore: complete step 4 for stub-format-config — APPROVED * fix(stub-format-config): add self parameter to class-method stubs * feat(stub-format-config): assign unique @id values to resolve collisions * fix(stub-format-config): rename tests to match new @id values, remove non-conforming skips * chore: update TODO.md — ready for Step 4 re-verification * chore: complete step 4 for stub-format-config — APPROVED * feat(stub-format-config): accept feature at Step 5 — move to completed * fix(plugin-hook): add deprecated @id:e3a13b58 AC and replace orphan skip with deprecated marker * chore(release): bump version to v3.2.20260419 — Mason Osmia * fix(ci): clean dist/ before build to prevent stale artifact reuse
…ions (default) or classes
…kip with deprecated marker
…erkin-coverage, background-docstring
… feature_parser
…sting to ≤2 levels
…ed local variable
…s of length or format _collect_existing_ids previously used @id:([a-f0-9]{8}) which excluded non-8-char tags from the uniqueness set, causing a collision window where a generated ID could share its first 8 chars with an existing non-standard tag (GitHub #19). Regex changed to @id:(\S+) so every @id value is captured. Added @id:e9d7f615 acceptance test and a Hypothesis property test covering the invariant across arbitrary tag values.
…teps in docstring (@id:e5c3b271)
…ine stubs (@id:f3e1a290)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](actions/upload-artifact@v4...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
Author
LabelsThe following labels could not be found: Please fix the above issues or remove invalid values from |
Author
|
OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting If you change your mind, just re-open this PR and I'll resolve any conflicts on it. |
nullhack
added a commit
that referenced
this pull request
May 13, 2026
* feat: initial release of pytest-beehave A pytest plugin that runs acceptance criteria stub generation as part of the pytest lifecycle, with auto-ID assignment and generic step docstrings. Features: - plugin-configuration: custom features path via pyproject.toml [tool.beehave] - plugin-hook: stub sync runs before test collection via pytest_sessionstart - auto-id-generation: assigns @id tags to untagged Examples; CI enforcement - stub-sync: creates/updates/renames test stubs from .feature files - deprecation-sync: toggles @pytest.mark.deprecated in sync with @deprecated tag * chore: restructure project as v2 baseline - Replace developer agent with software-engineer agent - Update product-owner, reviewer agents with revised workflows - Add create-agent, design-patterns, feature-selection, refactor skills - Remove tdd skill (replaced by implementation skill) - Reset completed features back to backlog with updated Gherkin - Add features-path-config feature to in-progress - Expand project discovery with v2 design decisions (test structure, marker ownership, state machine) - Add scientific research docs (ai-agents, architecture, OOP, refactoring, testing, etc.) - Remove v1 post-mortems and academic research doc * refactor: replace syncer.py with modular architecture (feature_parser, stub_writer, stub_reader, sync_engine, bootstrap, reporter, models) - New modules: models.py, feature_parser.py, stub_writer.py, stub_reader.py, sync_engine.py, bootstrap.py, reporter.py - Removed syncer.py and syncer_test.py - plugin.py refactored to use pytest_configure only with bootstrap + sync - Class-based test structure for Rule blocks, examples_test.py for top-level - New stubs include @pytest.mark.skip(reason='not yet implemented') - 100% test coverage, 0 lint errors, 0 pyright errors - 91 tests passing * feat(scope): add gherkin multilingual compatibility feature * feat(scope): deprecate keyword-verbatim examples — testing library not beehave * feat(scope): remove out-of-scope keyword-verbatim examples from multilingual-feature-parsing * chore: update banner * feat(scope): rewrite examples to describe user behavior, not Gherkin spec internals * fix: resolve all audit findings — stubs, naming, orphan markers, AGENTS.md * chore: remove setup-project agent and template-config — not needed in this project * fix: rename BeeHave -> Beehave throughout * docs: rewrite README with living documentation framing and GitHub best practices * fix: close features-path-config (Step 5 fixes + move to completed), begin multilingual-feature-parsing Step 2 - Remove type: ignore from feature_parser.py — use cast() instead - Write error to stderr before pytest.exit() in plugin.py (test 124f65e7 was asserting wrong stream) - Move features-path-config to completed/ as a proper subfolder - Move multilingual-feature-parsing from backlog to in-progress - Update TODO.md to Step 2 ARCH with correct @id rows and agent name * chore: complete step 2 for multilingual-feature-parsing — advance to step 3 TDD loop * feat(multilingual-feature-parsing): implement 3 i18n tests proving gherkin-official handles Spanish and Chinese transparently * feat(multilingual-feature-parsing): fix OC-7 violation, accept feature, move to completed * feat(plugin-hook): verify, fix OC-7, accept feature — move to completed * refactor(tests): restructure all feature tests to class-based layout per spec All tests/features/ test files now use class Test<RuleSlug> containing test methods, matching the architecture spec in stub-creation.feature. Old flat-function test directories deleted and replaced with properly structured class-based equivalents. Also moves stub-creation to in-progress and selects it as the active feature. * feat(stub-creation): implement all pending test stubs and fix tag inheritance - Fix RuleSlug to use underscores, rename all hyphenated test files - Implement orphan-handling and non-conforming-handling tests - Fix @deprecated tag inheritance from feature/rule to examples in parser - Implement deprecation_sync tag inheritance tests (b3d7f942, a9e1c504, d6f8b231) - Implement features_dir_bootstrap tests (11 tests across 4 files) - Add non-conforming detection to sync_engine - Move test/test-fast verbosity control to per-task flags, add test-build task - 112 passed, 3 skipped (2 orphans + 1 deprecated), 100% coverage * chore: update TODO.md — all stub-creation tests green * refactor(docs): flatten features directory structure to match AGENTS.md spec Move all .feature files from subfolder convention to flat files: - in-progress/stub-creation/stub-creation.feature → in-progress/stub-creation.feature - completed/features-path-config/features-path-config.feature → completed/features-path-config.feature - completed/multilingual-feature-parsing/multilingual_feature_parsing.feature → completed/multilingual-feature-parsing.feature - completed/plugin-hook/plugin-hook.feature → completed/plugin-hook.feature Move backlog discovery stubs to flat .md files: - backlog/display-version/discovery.md → backlog/display-version.md - backlog/gen-tests-orphan-fix/discovery.md → backlog/gen-tests-orphan-fix.md Remove redundant multilingual-feature-parsing/discovery.md (content already in .feature) Update TODO.md Source path to match new location * refactor(stub-creation): fix OC-1 nesting, OC-7 logic, lint errors; write Self-Declaration * fix(stub-creation): remove dead constants, fix test_38d864b9 assertion, fix OC-5 violations, remove libcst dep * feat(stub-creation): accept feature at Step 5 — move to completed/ * chore: select deprecation-sync as next feature — all @id tests green, Step 3 complete * refactor(deprecation-sync): fix DRY and OC-1 violations in sync_engine deprecation helpers * fix(deprecation-sync): correct _sync_deprecated_top_level docstring scope and Self-Declaration OC-7 evidence * feat(deprecation-sync): accept feature at Step 5 — move to completed/ * chore: select auto-id-generation as next feature — all @id tests green, Step 3 complete * fix(auto-id-generation): remove orphan test, fix test naming, fix OC-1 nesting in id_generator * feat(auto-id-generation): accept feature at Step 5 — move to completed/ * chore: select stub-updates as next feature * feat(stub-updates): all @id tests green, fix test naming, write Self-Declaration * fix(stub-updates): detect class-method stubs in stub_reader, strengthen 3f9d1b56 assertion * feat(stub-updates): accept feature at Step 5 — move to completed/ * feat(features-dir-bootstrap): all @id tests green, fix test naming, write Self-Declaration * feat(features-dir-bootstrap): accept feature at Step 5 — move to completed/ * chore: reset TODO.md — all BASELINED features completed * chore: remove display-version.md from backlog * chore: remove gen-tests-orphan-fix.md — gen-tests superseded by plugin * chore: update git-release skill with bee genus naming, clean CHANGELOG * docs: rewrite README with bee metaphors and project flavor * chore(release): bump version to v2.0.20260418 - Industrious Bombus * feat: pytest-beehave v2.0 — full plugin implementation Squash merge of v2 branch into main — see PR #3 for full details. * feat(criteria): write acceptance criteria for report-steps * feat(report-steps): add architecture stubs * feat(report-steps): implement terminal steps display and HTML acceptance criteria column * fix(report-steps): apply reviewer fixes — spacing, noqa, naming, semantic gap, editable install * chore: update self-declaration after reviewer fixes * refactor(report-steps): fix test naming convention — top-level functions, no classes * chore: advance to Step 4 for report-steps * refactor(report-steps): extract helpers, fix OC-5/OC-7 violations per reviewer * docs: clarify OC-7 line counting excludes docstrings in AGENTS.md and skills * refactor(workflow): overhaul document model and remove obsolete tasks - Replace flat discovery.md with append-only discovery_journal.md + discovery.md changelog - Create docs/architecture.md as the single append-only ADR log - Remove gen-id, gen-tests, gen-todo tasks from pyproject.toml - Self-Declaration is conversation output only (never written to TODO.md) - PO owns all .feature file moves; SE and reviewer escalate when no feature is in-progress - Remove class-based test structure from all .feature files and skill docs - Fix test naming: test_<feature_slug>_<@id> (not rule_slug, not id_hex) - Conformance is 2-part (file + function name); class context removed everywhere - Update scope, session-workflow, implementation, verify, feature-selection skills - Update AGENTS.md filesystem structure and responsibility chain * refactor(workflow): sync with upstream template — self-declarations as conversation only - Self-Declaration is conversation output only for both PO and SE; never written to TODO.md - Remove Self-Declaration block from session-workflow TODO.md format (Step 1 and Step 3) - Update session-workflow Rules 8 and 9 to reflect conversation-only self-declarations - Revert implementation/SKILL.md: self-declaration remains conversation output - Revert verify/SKILL.md: reads self-declaration from conversation, not TODO.md - Add Reviewer Stance Declaration block to verify/SKILL.md report template - Add Next Steps section to verify/SKILL.md report template (APPROVED/REJECTED branches) - Update AGENTS.md Session Management: remove erroneous self-declaration in TODO.md reference - Update AGENTS.md Bug Handling: match exact upstream wording with backlog scheduling note - Add bug marker to pyproject.toml - Update feature-selection/SKILL.md routing: Stage 2 Step A (Stories) / Step B (Criteria) - Add Status: COMPLETE markers to discovery_journal.md sessions - Add gen-todo step to implementation/SKILL.md Write Test Stubs section * fix(workflow): apply upstream hotfixes #74 and #75 - Remove gen-todo from implementation/SKILL.md Write Test Stubs section (#75) - Remove gen-todo from session-workflow/SKILL.md Session End step 2 (#75) - Remove entire gen-todo Script section from session-workflow/SKILL.md (#75) - Fix numbered steps in session-workflow Session End (3 steps, not 4) (#75) - Self-Declaration in implementation/SKILL.md: verbal communication, dash bullets (#74) - Self-Declaration in scope/SKILL.md: verbal communication, dash bullets (#74) - Update hand-off text: 'communicated verbally' (#74) * feat(discovery): append report-steps synthesis to discovery.md * fix(docs): correct stale hyphen→underscore docstrings and ADR for RuleSlug * fix(stub-creation): add @bug criterion for Rule block top-level stub violation * fix(report-steps): extract intermediate variables to satisfy OC-5 in plugin.py and steps_reporter.py * fix(report-steps): resolve OC-5 in steps_reporter.py:29 and OC-6 abbreviations in plugin.py and reporter.py * feat(report-steps): accept feature at Step 5 — move to completed/ * chore(artifacts): normalize all docs to current AGENTS.md standard * chore(artifacts): fix remaining feature file and discovery.md format violations * chore(sync): merge upstream v6.1.20260419 + hotfix 633e701 - Add living-docs skill (C4 + glossary generation for PO at Step 5) - Add docs/c4/ and docs/post-mortem/ directory placeholders - Add scientific-research/documentation.md (entries 59-62) - Update AGENTS.md: living-docs row, filesystem structure, step/role wording - Update create-skill/SKILL.md: add living-docs to available skills table - Update implementation/SKILL.md: glossary read step, TDD prerequisite, stub template cleanup - Update verify/SKILL.md: drop Standards Summary and When to Use, simplify 6b/6d, fillable Reviewer Stance Declaration, updated Next Steps - Update git-release/SKILL.md: add Step 6 living-docs + renumber steps 6-9, add checklist item - Slim reviewer.md: remove default-hypothesis para, After APPROVED block, Available Skills * docs(readme): rewrite for clarity — tutorial-first, scannable, zero metaphor overload Based on Diátaxis (tutorial scope only), Ko et al. (answer what/why/what-deps upfront), and cognitive load principles (tables over prose). Keeps bee wordplay in the name only. * feat: deliver features 1, 2a, 2b (step_decorators, id_sync, generate_core) Feature 1 — Step Decorators + Strategy Resolution (8 @ids) Feature 2a — Traceability @id Tags and Sync (7 @ids) Feature 2b — Traceability Generate Core (6 @ids) 21 tests passing, ruff clean, ObjCal compliant * stubs: add source and test stubs for traceability_generate_modes * feat: deliver feature 2c (traceability_generate_modes) 6 @id tags: scope discovery, JSON output, --json auto-append, non-TTY auto-append, empty feature handling, malformed file resilience. 27 tests passing, ruff clean. * stubs: add source and test stubs for traceability_fix_clean * feat: deliver feature 2d (traceability_fix_clean) 5 @id tags: fix text mismatches, add missing decorators, dry-run mode, clean with confirmation, clean with --force. 32 tests passing, ruff clean. * chore: update git branch strategy — dev branch replaces main for development Replace git: main with git: dev across all flow files, update committed-to-main-locally conditions to committed-to-dev-locally, and update AGENTS.md and skill files. Only stakeholders merge to main. * feat: add typed stubs and test skeletons for feature_parsing_mapping Source stubs (Feature Parsing + Validation bounded contexts): - beehave/parsing.py: FeatureFile entity, Rule/TestModule/TestDirectory VOs, resolve_test_module_path/resolve_all_test_modules/resolve_test_directory functions - beehave/validation.py: Mismatch VO, validate_step_text function - Updated __init__.py exports Test stubs (5/5 @id coverage): - tests/features/feature_parsing_mapping/mapping_test.py (3 examples: 2a8f5c1e, 7d3b9e6a, cbac8dae) - tests/features/feature_parsing_mapping/step_text_test.py (2 examples: 4c1f8d3b, e6a2c7f9) * feat(parsing): implement feature→test-module mapping and step text validation @id:2a8f5c1e @id:7d3b9e6a @id:cbac8dae @id:4c1f8d3b @id:e6a2c7f9 - Rule/FeatureFile → TestModule path resolution (no Rule→default, single→named, multi→multiple) - Snake case normalization for Rule names - Exact character-for-character step text validation with Mismatch reporting * chore: split feature 3 into 3a (mapping) and 3b (ordering), update domain model and glossary * chore: fix spec review findings for feature_parsing_ordering — add @And/@but example, reconcile adoption levels * feat: add typed stubs and test skeletons for feature_parsing_ordering * feat(feature_parsing_ordering): implement step ordering, placeholder matching, and adoption levels @id:9f5d3b2a @id:1c8e4a7d @id:b7e2f1a4 @id:5b7f2d9e @id:d3a6c1b8 @id:8e2f7c4a @id:a4d9b3e6 - validate_step_ordering: Given→When→Then with @And/@but inheritance - validate_placeholders: regex extraction, mismatch reporting - AdoptionLevel enum, ValidationReport entity with is_clean - Edge case tests for And-before-Given and When-after-Then * feat(reporting): add typed source stubs and test skeletons for failure_reporting - Source: beehave/reporting.py with StepStatus (IntEnum), StepReport (frozen dataclass), FailureReport (dataclass), render_failure_report() and render_step_text() stubs - Exports: added FailureReport, StepReport, StepStatus to beehave/__init__.py - Test stubs: 6 tests across 4 files (passing, assertion, line_number, rendering) covering 4 Rules with @id traceability verified 6/6 * feat(reporting): implement failure reporting with TDD @id:8e4a2c7f @id:1d6b3f9e @id:c5a8e27d @id:3f7b9d4a @id:6e2c8b1f @id:b9d4a7c3 Implements render_failure_report (Then-failed + line-number heuristics) and render_step_text (placeholder substitution). 52 tests passing. * docs: update spec artifacts from failure_reporting review - failure_reporting.feature: move supplementary report rule to Constraints, add known limitation note to Then-failed heuristic, update line-number heuristic to include @then - domain_model.md: add @but to Then-failed, @then to line-number heuristic - glossary.md: add FailureReport, StepReport, Then-failed Heuristic, Line-number Heuristic entries; align Report Template wording * feat: add dogfood feature (decorator_test) and 6 post-mortems Dogfood exercise using beehave to test beehave end-to-end: - Created decorator_test.feature with bee-themed Gherkin (3 @ids) - Verified: generate stubs, sync IDs, traceability, fix dry-run - All 55 tests passing (52 existing + 3 dogfood) 6 post-mortems from pain points discovered: - PM_generate_empty_file_paths: generate() output shows empty paths - PM_generate_repeated_imports: appended stubs duplicate imports - PM_generate_no_init_py: test directories miss __init__.py - PM_generate_stub_no_skip_marker: stubs pass instead of skip - PM_generate_no_step_decorators: stubs omit step decorators - PM_strategy_fallback_confusing: silent st.integers() fallback * docs: add interview notes from dogfood exercise (6 pain points) IN_20260511_dogfood_pain_points — structured Q&A for each of the 6 pain points discovered during end-to-end dogfooding of beehave's generate() command. Maps each to quality attributes and action items. 4 Must-fix (empty paths, repeated imports, silent pass, no step decorators) 2 Should-fix (missing __init__.py, strategy fallback warning) * refactor: rename 'dogfood' to 'self-validation' across all docs More professional terminology for the end-to-end validation exercise. * feat: add test stubs for self_validation_fixes (7 @ids) Create test skeleton for feature 5: self-validation fixes. 7 test stubs covering PP1-PP6 pain points from self-validation exercise. Stubs: - f1a2b3c4: text output shows created file path (PP1) - d5e6f7a8: appending shows file path (PP1) - b9c0d1e2: one import block on append (PP2) - f3a4b5c6: __init__.py creation (PP3) - d7e8f9a0: stubs are skipped by pytest (PP4) - b1c2d3e4: step decorators in stubs (PP5) - a5b6c7d8: strategy fallback warning (PP6) * feat: self-validation fixes — observable output, clean stubs, strategy warning (7 @ids) * chore: remove self_validation_fixes feature and tests for dogfood re-exercise * docs: add 5 post-mortems from dogfood re-exercise with rich Gherkin * docs: add discovery artifacts for rich Gherkin pain points (6a-6d) * docs: break down parser_keyword_recognition feature (3 Rules, 6 @ids) * docs: address spec-review findings for parser_keyword_recognition Remove unmeasurable 'And the scenario is not skipped or ignored' from Rule 1 Examples (7f3a9c2e, b4e18d6f). Remove compound Then outcomes from Rule 2 Examples (2c8f5a1d, 9e6b3f7a) — placeholder substitution is implicit in row expansion, not a separate observable outcome. Non-blocking observation: domain_model.md Scenario entity says 'optional Examples table' but FeatureScenario invariant says 'every scenario has an ExamplesTable' — pre-existing inconsistency, not from this feature. * chore: add test stubs for parser_keyword_recognition (6a) * feat: parser keyword recognition (PP7+PP9) — Scenario Outline/Template headings, Examples expansion, step boundary integrity * docs: break down quote_escaping feature (1 Rule, 6 @ids) * docs: address spec-review findings for quote_escaping * feat(quote_escaping): add test stubs for quote escaping in stubs (6 examples) Feature 6b — PP8: generated step decorators with quotes produce valid Python. No new source stubs; modifies _generate_stub_content() in beehave/cli.py. @a1b2c3d4 double quotes preserved in single-quoted outer @e5f6a7b8 single quotes escaped with backslash @9c0d1e2f both quote types handled together @3a4b5c6d no quotes baseline regression @7e8f9a0b multiple quoted steps in one scenario @c1d2e3f4 idempotent re-generation with quotes * feat: quote escaping in generated stub decorators (PP8) Switch from double-quoted to single-quoted decorator strings with backslash escaping of embedded single quotes. Fixes SyntaxError when step text contains quotes. Updates _DECORATOR_RE to match both quote styles and _insert_decorator_before_function to use the same escaping strategy. 6 tests, 64 total passing. * docs: break down fix_command_alignment feature (3 Rules, 5 @ids) * feat(fix_command_alignment): add test stubs for diff-based alignment (5 @ids) 5 test stubs for fix_command_alignment feature (delivery order 6c, Should): - a1c3e5f7: mid-scenario insertion produces single insertion proposal - b2d4f6a8: mid-scenario deletion produces single deletion proposal - c3e5a7b1: changed step text classified as replace - d4f6b8c2: similar steps not falsely aligned - e5a7c9d3: fix results idempotent after applying changes No source stubs needed — modifies existing _find_text_mismatches() in beehave/cli.py. * feat: fix command alignment with difflib.SequenceMatcher (6c, PP10) * docs: break down generate_messaging feature (2 Rules, 3 @ids) * docs: unify advisory text in generate_messaging examples * feat(generate_messaging): add test stubs for generate messaging (3 @ids) Test stubs for delivery order 6d — generate() must distinguish between no scenarios and untagged scenarios with actionable advisory output. @id:7a3f9b2e - all scenarios lack @id tags — advisory message @id:8c4d0e6f - some scenarios lack @id tags — partial warning @id:2b5e1a9c - zero scenarios — distinct no-scenarios-found message * feat: generate_messaging — advisory for untagged scenarios (PP11, 6d) 3 @ids: 7a3f9b2e (all untagged), 8c4d0e6f (partial), 2b5e1a9c (empty) AD3: advise only, never auto-invoke sync * fix: rename 2a test functions to convention, remove stale @id reference - Rename test_id_tag_* and test_sync_* to test_traceability_id_sync_* - Remove @id:3e9b1c6a from Changes table (moved to 2b in earlier spec review) - m3n4o5p6 and my_custom_name are Given-clause data values, not Example @ids * docs: add 3 post-mortems from self-check dogfood exercise (PP12-PP14) * feat: PP12-PP15 — import completeness, idempotent parse, escape handling, universal parameterization, @id whitespace fix, README * docs: add beehave v2 spec and post-mortems (rounds 1-3) - docs/spec/beehave_v2_spec.md: comprehensive v2 specification - docs/v2/post-mortem.md: round 1 (10 resolved, 1 dropped) - docs/v2/post-mortem-r2.md: round 2 (9 resolved, 3 dropped) - docs/v2/post-mortem-r3.md: round 3 (7 resolved, 0 dropped) * docs: v2 spec rounds 4-9 — adversarial review complete (70+ issues resolved) - R4: 15 issues (cache redesign, fix scope, auto_inference, decorator order, @background+Scenario Outline) - R5: 8 issues (Background↔cache architecture, strategy binding, @example matching, cache precision) - R6: 13 issues (no placeholders in Background, cache structure, @and inheritance, deep equality bijection) - R7: 10 issues (Hypothesis stacking, Background restrictions, UTF-8 BOM, boolean detection) - R8: 7 issues (sync removal, name parameter, stub body, max_examples, background stubs) - R9: 6 issues (default consistency, @and scope, Feature/Rule title chars, generate append, clean backgrounds) Key design decisions finalized: - No placeholders in Background (aligns with standard Gherkin) - max_examples default: 1 (configurable) - All step decorators are metadata collectors, strategy resolution in decorator phase - Cache: SHA-256 content hashing, feature-files only, typed examples - Feature/Rule/Scenario titles: Unicode letters, digits, spaces only - generate: ... body stubs, background stubs named background_<name> - clean: removes orphans + unreferenced background functions * docs: rewrite v3 spec — consistent, all 20 adversarial issues resolved Complete rewrite by domain-expert, product-owner, and system-architect agents. Key fixes from R10 review: - Default strategy: st.text() everywhere (was st.integers() in 3 places) - Stub exemption: both ... and pass (was ... only) - Module-level variable discovery: defined via AST top-level Assign nodes - @example() bijection: type coercion defined (Examples → Python types) - Function name derivation: 5-step algorithm specified - Background <placeholder>: parse error (was undefined) - generate: skip-existing (was undefined) - Body enforcement: quoted strings = double-quoted in Gherkin only - Negative numbers: not supported as literals - check output: machine-parseable format specified - Error handling: complete table added - No background functions (removed v2 leftover) - Rule title uniqueness: motivated by internal keying + Gherkin spec * docs: v3 spec — file conventions with rules, max_examples=1 config, title rules for all levels * docs: v3 spec R11 — fix 8 issues from adversarial emulation HIGH fixes: - Import block: defined generation rules + update-on-append behavior - Deleted feature: check scans ALL test files, not just matched ones - max_examples: generate emits @settings(max_examples=N) on every @given() MEDIUM fixes: - clean --force: warns before deleting non-stub orphan functions - Background literals: only quoted strings enforced (not numbers) - Same-name placeholder limitation: documented explicitly - Placeholder deduplication: stated explicitly LOW fixes: - Empty Examples table: parse error on Scenario Outline * docs: v3 spec — pytest-beehave plugin as external project, composable module API * chore: clean slate for v3 — keep only spec, assets, branding, pyproject, gitignore * feat: implement beehave v3 — generate, check, clean CLI from Gherkin features Complete implementation of the v3 architecture (~1,250 LOC): - gherkin.py: parse .feature files via gherkin-official, title validation, background merging, literal extraction (both single and double quotes) - discover.py: AST-based test function discovery - check.py: dict-join consistency enforcement (placeholders, literals, examples bijection, unmapped detection) - generate.py: stub generation with hypothesis profiles, type-inferred strategies from Examples tables - clean.py: unmapped function removal (safe for stubs, --force for all) - cli.py: argparse entry point with generate/check/clean subcommands - config.py: pyproject.toml [tool.beehave] configuration loading - models.py: ScenarioInfo, TestInfo, Violation dataclasses Includes discovery artifacts (product definition, domain model, glossary, interview notes), showcase features (hive_activity, comb_construction), and README with banner. * docs: rewrite README + update v3 spec with stakeholder decisions README: problem-solution structure, full-width banner, practical walkthrough with real error output. Spec: add misplaced-test error type, background config params, feature path algorithm, global fallback for check <feature>. * docs: rewrite README with actual features, add rules and backgrounds README now uses the real bee-themed features with Background, Rules, string/numeric literals, and shows real check output. Feature files updated to showcase full Gherkin surface: feature background, rules with and without background, literal scoping, Scenario Outline with Examples.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps actions/upload-artifact from 4 to 7.
Release notes
Sourced from actions/upload-artifact's releases.
... (truncated)
Commits
043fb46Merge pull request #797 from actions/yacaovsnc/update-dependency634250cInclude changes in typespec/ts-http-runtime 0.3.5e454baaReadme: bump all the example versions to v7 (#796)74fad66Update the readme with direct upload details (#795)bbbca2dSupport direct file uploads (#764)589182cUpgrade the module to ESM and bump dependencies (#762)47309c9Merge pull request #754 from actions/Link-/add-proxy-integration-tests02a8460Add proxy integration testb7c566aMerge pull request #745 from actions/upload-artifact-v6-releasee516bc8docs: correct description of Node.js 24 support in READMEDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)