Skip to content

Transitions part 2#331

Merged
ahouseholder merged 40 commits intomainfrom
transitions-part-2
Mar 24, 2026
Merged

Transitions part 2#331
ahouseholder merged 40 commits intomainfrom
transitions-part-2

Conversation

@ahouseholder
Copy link
Contributor

This pull request introduces several improvements to the project's developer workflow documentation and automation, focusing on making code formatting, linting, and testing procedures more discoverable, standardized, and agent-friendly. It adds new SKILL documents for code formatting, markdown linting, and running linters, updates project instructions to clarify conventions and commands, and makes minor configuration changes for code ownership and linting.

Developer Workflow Documentation and Automation:

  • Added new SKILL documents in .github/skills/ for:
    • Formatting Python code with Black (format-code)
    • Formatting/linting Markdown with markdownlint-cli2 (format-markdown)
    • Running the canonical set of repository linters (Black, flake8, mypy, pyright) (run-linters)
  • Removed the older, less structured SKILL for formatting and testing, replacing it with modular, discoverable SKILLs.

Project Instructions and Documentation:

  • Major update to .github/copilot-instructions.md:
    • Clarified project status, core concepts, and architecture.
    • Added explicit commands for setup, formatting, testing, and linting.
    • Documented hexagonal architecture, naming conventions, and use-case protocol.
    • Provided detailed checklists for adding new message types and conventions for state machines, error handling, and testing.
  • Improved the build prompt (.github/prompts/BUILD.md):
    • Clarified code search instructions.
    • Added requirements for always adding/updating tests and following DRY principles [1] [2] [3].

Configuration and Ownership:

  • Updated .github/CODEOWNERS to explicitly assign ownership of the .github folder.
  • Updated .flake8 to additionally ignore E203.

These changes collectively make the project's development and contribution process more robust, consistent, and accessible to both humans and automation.

ahouseholder and others added 30 commits March 20, 2026 17:07
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- IMPLEMENTATION_PLAN.md:
  - Update header to reflect current status (996 tests, transitions-part-2)
  - Add completed tasks to previously-completed list (TECHDEBT-16–28,
    VCR-* batches A/B/C/D/E, PREPX-1/2/3, ACT-1, OX-1.0, DOCS-1/2,
    P90-2, P90-3)
  - Add Phase PRIORITY-85 section (complete)
  - Update Phase PRIORITY-90: mark P90-2/3 done, refine P90-1/4 descriptions,
    add P90-5 (OPP-06 → spec requirement)
  - Add new tasks: TECHDEBT-29 (VCR-005 follow-up), TECHDEBT-30 (semantic
    field naming), TECHDEBT-31 (trigger_services relocation), TECHDEBT-32
    (DataLayer boundary research), TECHDEBT-33 (test_handlers.py refactor),
    TECHDEBT-34 (remaining procedural state logic → transitions machines)

- IMPLEMENTATION_NOTES.md: reset to ~70 lines; all struck-through content
  removed; durable items extracted to notes/; current open items summarised

- notes/domain-model-separation.md: add four new sections:
  - Wire-layer terminology leaking into core event interfaces
  - Core should reliably get domain objects from DataLayer
  - Datalayer storage records need re-evaluation
  - Vocabulary registry entanglement (db_record.py, rehydration.py)

- notes/codebase-structure.md: add two new sections:
  - Bulk module-rename lessons learned (VCR-019a)
  - Trigger services package: what remains and where it should go

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move vultron/api/v2/backend/trigger_services/ into
vultron/adapters/driving/fastapi/ per architectural cleanup plan:

- Move HTTP request body models (_models.py) to
  vultron/adapters/driving/fastapi/trigger_models.py
- Move domain_error_translation() and translate_domain_errors() from
  _helpers.py into vultron/adapters/driving/fastapi/errors.py
- Merge thin adapter delegates (case.py, embargo.py, report.py) into
  new vultron/adapters/driving/fastapi/_trigger_adapter.py
- Update all three trigger routers to import from new adapter-layer
  locations (no shims)
- Update test/api/v2/backend/test_trigger_services.py imports
- Delete vultron/api/v2/backend/trigger_services/ entirely

After this change, vultron/api/v2/ contains only data/actor_io.py
(pending VCR-014) and two __init__.py stubs.

996 tests pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Update GET /actors/{actor_id}/profile to return inbox and outbox as
string URL links rather than embedded OrderedCollection objects. This
aligns with ActivityPub federation conventions for actor discovery.

- specs/agentic-readiness.md: Update AR-10-001 to require inbox/outbox
  as URL strings (not embedded collection objects); update verification
  section accordingly
- routers/actors.py: Remove response_model=as_Actor; build profile dict
  from model_dump and override inbox/outbox with string URLs
- test_actors.py: Assert inbox and outbox are str instances, not dicts

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…est files

Move all 44 remaining test methods from the monolithic
test/api/v2/backend/test_handlers.py into per-module files under
test/core/use_cases/, mirroring the source layout:

- test_embargo_use_cases.py  (TestEmbargoUseCases — 11 tests)
- test_note_use_cases.py     (TestNoteUseCases — 6 tests)
- test_status_use_cases.py   (TestStatusUseCases — 7 tests)
- test_case_use_cases.py     (TestCaseUseCases — 6 tests)
- test_report_use_cases.py   (TestReportReceiptRM — 3 tests added)

Delete test/api/v2/backend/test_handlers.py.

976 tests pass (was 913; +63 reflects newly visible migrated tests).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…_ids, OPP-06 spec

OB-05-002: Implement DataLayer connectivity check in /health/ready
- Inject DataLayer via Depends; wrap dl.read('') in try/except
- Return HTTP 503 when DataLayer raises; 200 when healthy
- Update test_health.py: use datalayer fixture, add 503 test case

AR-01-003: Add unique, stable operation_id to all FastAPI route decorators
- Convention: {resource}_{action} (e.g. actors_list, datalayer_get_offer)
- Covers actors, datalayer, examples, health, trigger_case,
  trigger_embargo, trigger_report, v2_router (39 routes total)

P90-5: Capture OPP-06 requirement in specs/behavior-tree-integration.md
- New section BT-12 VFD/PXA State Machine Usage
- BT-12-001: future VFD/PXA transitions MUST use create_vfd_machine() /
  create_pxa_machine() as authoritative sequence source (no hand-rolled logic)
- Added BT-12-001 verification entry

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
7 unit tests for the outbox handler processing loop:
- handle_outbox_item logs actor_id and item
- outbox_handler drains outbox on success (FIFO order, OX-01-002)
- empty outbox no-ops
- retry/abort logic after >3 consecutive errors
- continues after a single recoverable error

Tests monkeypatch get_datalayer for isolation; pattern mirrors
test_inbox_handler.py.

Bug BUG-001 documented in plan/BUGS.md: outbox_handler does not return
early when actor is None, causing AttributeError on the next line.

984 passed, 5581 subtests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
In CreateReportReceivedUseCase and SubmitReportReceivedUseCase, after
storing the VulnerabilityReport, create and persist a
VultronParticipantStatus record with rm_state=RM.RECEIVED for the
receiving actor. This implements ADR-0013 step 1: the explicit
START → RECEIVED (RECEIVE trigger) transition in the report phase.

- Add _report_phase_status_id() helper to _helpers.py, using UUID v5
  for a deterministic, idempotent record ID keyed on (actor, report,
  rm_state).
- Context is set to the report ID (pre-case phase anchor).
- attributed_to is set to the actor_id.
- Creation is guarded by _idempotent_create; duplicate calls produce
  exactly one record.
- Existing set_status() calls are retained (P90-4 will remove them).
- Three new tests cover persistence, Submit variant, and idempotency.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…taLayer

Remove STATUS global dict, ReportStatus, set_status(), get_status_layer(),
status_to_record_dict(), and _current_report_rm_state() from
core/models/status.py. Keep OfferStatusEnum, ObjectStatus, OfferStatus.

Replace all STATUS reads/writes with DataLayer VultronParticipantStatus
records using deterministic IDs via _report_phase_status_id():

- core/use_cases/report.py: removed remaining set_status() calls
  (DataLayer path already present from P90-1)
- core/use_cases/triggers/report.py: replaced get_status_layer()/set_status()
  with dl.get('ParticipantStatus', ...) and _idempotent_create()
- core/behaviors/report/nodes.py: CheckRMStateValid and
  CheckRMStateReceivedOrInvalid now query DataLayer; TransitionRMtoValid
  and TransitionRMtoInvalid create VultronParticipantStatus records

Update all 5 affected test files to use DataLayer assertions.
Remove TestReportReceiptRM class (superseded by TestReportReceiptPersistsParticipantStatus).

984 tests pass, 5581 subtests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…vent interfaces

Add 14 reusable property mixins in vultron/core/models/events/_mixins.py.
Each mixin exposes a domain-specific property (e.g., report_id, case_id,
embargo_id, offer_id, invite_id, participant_id, note_id, status_id,
invitee_id) that aliases the appropriate generic VultronEvent base field.

Per-semantic event subclasses in actor.py, case.py, case_participant.py,
embargo.py, note.py, report.py, and status.py inherit the relevant mixin(s).

Updated all 7 use-case modules to use domain properties instead of generic
object_id / target_id / context_id / inner_* field names.

984 tests pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- AGENTS.md: explicitly deprecate vultron/api/v2/ and test/api/; update
  test layout reference to mirror current source structure
- notes/domain-model-separation.md: add 'Extractor as EventFactory' section
  capturing Activity.to_domain()/EventFactory design option and centralized
  AS2→core field mapping strategy
- specs/code-style.md: add CS-02-002 sub-rule prohibiting local imports
  inside test functions
- plan/IMPLEMENTATION_PLAN.md: add TECHDEBT-35 (expand _mixins.py),
  TECHDEBT-36 (centralize _make_payload() test helper),
  TECHDEBT-37 (migrate test/api/ to new layout)
- plan/IDEAS.md: strike through mixin expansion idea (→ TECHDEBT-35)
- plan/IMPLEMENTATION_NOTES.md: strike through all captured items with
  references to where they now live

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…analysis and TECHDEBT-34

- Mark P90 COMPLETE: all five tasks (P90-1 through P90-5) done; remove stale
  'P90 in progress' line from status summary; update Active phases section
- Update Gap Analysis to refresh #45; add ✅ P90/ADR-0013 complete entry and
  ❌ BUG-001 entry
- Update TECHDEBT-34: note OPP-01/02/03 are complete; clarify remaining scope
  to unguarded direct em_state/rm_state assignments in core
- Add TECHDEBT-38: fix outbox_handler missing return after actor is None
  (BUG-001 from plan/BUGS.md)
- Add TECHDEBT-39: consolidate duplicate participant RM state helpers (OPP-05)
- Update Phase PRIORITY-90 section heading to ALL COMPLETE ✅

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The actor-is-None guard logged a warning but fell through to
'while actor.outbox.items:', raising AttributeError. Add 'return'
immediately after the warning to short-circuit the rest of the
function.

Adds regression test: test_outbox_handler_returns_early_when_actor_not_found

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ahouseholder and others added 5 commits March 24, 2026 11:29
P1 (runtime crash) fixes:
- extractor.py: move VultronEvent/EVENT_CLASS_MAP/VultronTypes imports
  to module level; remove forward-reference string annotation
- helpers.py: remove spurious f-prefix from non-interpolating f-string
- robot.py: add missing _parse_args() function
- mcp_server.py: fix 9 use-case call signatures (SvcXxx(dl, req).execute())

P3/P4 (unused imports) fixes:
- Remove unused imports across 14 test files, 12 demo scripts, 5 vocab
  example files, and various adapter/use-case modules
- Restore BASE_URL in demo modules with # noqa: F401 (needed for test
  monkeypatching via mp.setattr)
- Fix F811 (logging redefinition) in test_embargo_use_cases.py
- Fix F841 (assigned-but-unused vars) in test_cli.py, test_create_tree.py,
  test_create_activity.py, and triggers/embargo.py

E402 (imports not at top) fixes:
- test_trigger_services.py: move FUTURE_DATETIME constant after all imports
- test_performance.py: move logger = ... after all imports; remove unused
  DataLayer import

E203 (.flake8):
- Add E203 to extend-ignore (Black-style slice whitespace)

All # noqa placement fixed to appear on the opening 'from X import (' line,
not on the closing ')' line (where flake8 ignores them).

Result: flake8 clean, 985 tests pass, Black unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 24, 2026 15:34
@ahouseholder ahouseholder self-assigned this Mar 24, 2026
@ahouseholder ahouseholder added enhancement New feature or request tech/environment Changes to project infrastructure tech/backend Changes to modules, libraries, etc. labels Mar 24, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR continues the protocol “transitions” refactor by consolidating trigger adapters into the FastAPI driving adapter, introducing domain-friendly event property mixins, and moving RM status tracking away from the removed global STATUS dict toward DataLayer-backed ParticipantStatus records—alongside a large set of documentation/workflow and test updates.

Changes:

  • Replaces in-memory RM status tracking with deterministic, idempotent DataLayer persistence via _report_phase_status_id() + VultronParticipantStatus.
  • Refactors FastAPI trigger plumbing (request models, error translation, adapters) and adds stable operation_id values across routes.
  • Adds/updates substantial specs/notes/plan documentation plus new SKILL/prompt docs and expanded test coverage.

Reviewed changes

Copilot reviewed 118 out of 122 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
vultron/wire/as2/vocab/examples/status.py Removes unused imports in vocab examples.
vultron/wire/as2/vocab/examples/participant.py Removes unused imports in vocab examples.
vultron/wire/as2/vocab/examples/note.py Removes unused imports in vocab examples.
vultron/wire/as2/vocab/examples/embargo.py Removes unused imports in vocab examples.
vultron/wire/as2/vocab/examples/case.py Removes unused imports in vocab examples.
vultron/wire/as2/vocab/examples/actor.py Removes unused imports in vocab examples.
vultron/wire/as2/vocab/base/objects/activities/base.py Cleans unused typing import.
vultron/wire/as2/extractor.py Promotes imports + tightens return type annotations for extracted events.
vultron/demo/trigger_demo.py Removes unused imports.
vultron/demo/suggest_actor_demo.py Adds explicit # noqa: F401 comment for monkeypatch-related import.
vultron/demo/status_updates_demo.py Adds explicit # noqa: F401 comment; removes unused imports.
vultron/demo/receive_report_demo.py Adds explicit # noqa: F401 comment.
vultron/demo/manage_participants_demo.py Adds explicit # noqa: F401 comment.
vultron/demo/manage_embargo_demo.py Removes unused imports; adds explicit # noqa: F401 comment.
vultron/demo/manage_case_demo.py Adds explicit # noqa: F401 comment.
vultron/demo/invite_actor_demo.py Removes unused imports; adds explicit # noqa: F401 comment.
vultron/demo/initialize_participant_demo.py Adds explicit # noqa: F401 comment.
vultron/demo/initialize_case_demo.py Adds explicit # noqa: F401 comment; removes unused imports.
vultron/demo/establish_embargo_demo.py Removes unused imports; adds explicit # noqa: F401 comment.
vultron/demo/acknowledge_demo.py Adds explicit # noqa: F401 comment.
vultron/core/use_cases/triggers/report.py Switches trigger RM state writes/checks to DataLayer ParticipantStatus records.
vultron/core/use_cases/triggers/embargo.py Removes unused imports/variables.
vultron/core/use_cases/status.py Uses domain-friendly event properties (status_id, case_id, etc.).
vultron/core/use_cases/report.py Persists RM.RECEIVED participant status idempotently on report receipt paths.
vultron/core/use_cases/note.py Uses domain-friendly event properties (note_id, case_id).
vultron/core/use_cases/embargo.py Uses domain-friendly event properties (embargo_id, invite_id, case_id).
vultron/core/use_cases/case_participant.py Uses domain-friendly event properties (participant_id, case_id).
vultron/core/use_cases/case.py Uses domain-friendly event properties (case_id, report_id).
vultron/core/use_cases/actor.py Uses domain-friendly event properties (suggested_actor_id, offer_id, invite_id, etc.).
vultron/core/use_cases/_helpers.py Adds deterministic UUIDv5 helper _report_phase_status_id() to support idempotency.
vultron/core/models/status.py Removes global STATUS-layer logic; retains OfferStatus enums/models only.
vultron/core/models/events/status.py Adds mixin-based domain property access on status event types.
vultron/core/models/events/report.py Adds mixin-based domain property access on report/offer events.
vultron/core/models/events/note.py Adds mixin-based domain property access on note events.
vultron/core/models/events/embargo.py Adds mixin-based domain property access on embargo/invite events.
vultron/core/models/events/case_participant.py Adds mixin-based domain property access on participant events.
vultron/core/models/events/case.py Adds mixin-based domain property access on case/report-in-case events.
vultron/core/models/events/actor.py Adds mixin-based domain property access on actor-related events.
vultron/core/models/events/_mixins.py New: reusable mixins exposing domain-friendly ID properties over base fields.
vultron/core/behaviors/report/nodes.py Updates BT nodes to read/write RM state via DataLayer ParticipantStatus.
vultron/core/behaviors/helpers.py Minor error message string formatting cleanup.
vultron/bt/base/demo/robot.py Adds argparse parsing in __main__ for demo.
vultron/api/v2/backend/trigger_services/embargo.py Deleted legacy trigger service adapter module.
vultron/api/v2/backend/trigger_services/case.py Deleted legacy trigger service adapter module.
vultron/api/v2/backend/trigger_services/_helpers.py Deleted legacy FastAPI error translation helper module.
vultron/api/v2/backend/trigger_services/init.py Deleted legacy trigger service package init.
vultron/adapters/driving/mcp_server.py Updates trigger use-case call signature to pass request at construction time.
vultron/adapters/driving/fastapi/trigger_models.py New: FastAPI request body models for trigger endpoints.
vultron/adapters/driving/fastapi/routers/v2_router.py Adds stable operation_id for version endpoint.
vultron/adapters/driving/fastapi/routers/trigger_report.py Switches imports to adapter layer; adds operation_id fields.
vultron/adapters/driving/fastapi/routers/trigger_embargo.py Switches imports to adapter layer; adds operation_id fields.
vultron/adapters/driving/fastapi/routers/trigger_case.py Switches imports to adapter layer; adds operation_id fields.
vultron/adapters/driving/fastapi/routers/health.py Implements readiness probe with DataLayer dependency injection.
vultron/adapters/driving/fastapi/routers/examples.py Adds stable operation_id fields to example endpoints.
vultron/adapters/driving/fastapi/routers/datalayer.py Adds stable operation_id fields; removes unused import.
vultron/adapters/driving/fastapi/routers/actors.py Updates profile response to return inbox/outbox as URL strings; adds operation_id fields.
vultron/adapters/driving/fastapi/outbox_handler.py Fixes missing early return when actor is not found.
vultron/adapters/driving/fastapi/errors.py Introduces adapter-local domain→HTTP error translation helpers.
vultron/adapters/driving/fastapi/_trigger_adapter.py New consolidated adapter functions wrapping core trigger use cases.
vultron/adapters/driven/delivery_queue.py Clarifies unused import with inline # noqa: F401 comment.
test/wire/as2/vocab/test_vulnerability_case.py Removes unused imports.
test/wire/as2/vocab/test_create_activity.py Removes unused variable assignment.
test/wire/as2/vocab/test_base_utils.py Removes unused imports.
test/wire/as2/test_extractor.py Removes unused imports.
test/test_semantic_activity_patterns.py Removes unused typing import.
test/test_behavior_dispatcher.py Removes unused import.
test/demo/test_receive_report_demo_bug.py Removes unused imports.
test/demo/test_health_check_retry.py Removes unused imports.
test/demo/test_cli.py Removes unused variables; minor invocation cleanup.
test/demo/conftest.py Adds explicit # noqa: F401 re-export annotation.
test/core/use_cases/test_status_use_cases.py New: tests for status use cases (create/add case & participant status).
test/core/use_cases/test_report_use_cases.py Adds tests asserting receipt persists RM.RECEIVED ParticipantStatus.
test/core/use_cases/test_note_use_cases.py New: tests for note use cases (create/add/remove note).
test/core/use_cases/test_case_use_cases.py New: tests for case update use case behavior.
test/core/use_cases/test_actor_use_cases.py Removes unused import.
test/core/behaviors/test_performance.py Import ordering cleanup.
test/core/behaviors/report/test_validate_tree.py Updates validation-tree tests to use DataLayer-backed status records.
test/core/behaviors/report/test_policy.py Removes unused import.
test/core/behaviors/report/test_nodes.py Updates node tests to use DataLayer-backed status records.
test/core/behaviors/report/conftest.py Updates # noqa placement for side-effect import.
test/core/behaviors/case/test_create_tree.py Removes unused intermediate variables.
test/core/behaviors/case/conftest.py Updates # noqa placement for side-effect import.
test/conftest.py Removes unused import.
test/api/v2/routers/test_trigger_report.py Updates fixtures/assertions for DataLayer-backed RM state.
test/api/v2/routers/test_trigger_case.py Aligns expected FastAPI validation status constant; minor import reorder.
test/api/v2/routers/test_health.py Adds readiness failure-path test via dependency override.
test/api/v2/routers/test_actors.py Updates expectations for profile inbox/outbox URL string behavior.
test/api/v2/backend/test_trigger_services.py Updates trigger-service tests to use new adapter imports + DataLayer-backed RM state.
test/api/v2/backend/test_outbox.py New: unit tests for outbox handler processing and error paths.
specs/project-documentation.md Clarifies plan/priority source-of-truth rules.
specs/code-style.md Adds explicit rule against imports inside test functions.
specs/case-management.md Refines case-state transition validation requirements (CM-04-005/006).
specs/behavior-tree-integration.md Adds BT-12-001 guidance on using authoritative transitions machines for VFD/PXA.
specs/agentic-readiness.md Updates AR-10-001 to require inbox/outbox URL strings.
specs/README.md Updates implementation snapshot section to reflect current architecture status.
plan/PRIORITIES.md Removes older priority text; adds prototype deferral policy pointer.
plan/IMPLEMENTATION_HISTORY.md Adds detailed history entries for multiple TECHDEBT/P90 tasks.
plan/BUGS.md Adds BUG-001 entry and marks it fixed.
notes/state-machine-findings.md Adds transitions+Pydantic integration guidance.
notes/domain-model-separation.md Adds durable notes on wire-layer mutation helpers and coupling concerns.
notes/codebase-structure.md Adds module-rename lessons learned + trigger_services migration plan notes.
notes/case-state-model.md Adds OPP-06 guidance reference.
notes/README.md Updates notes index entries.
docs/adr/0013-unify-rm-state-tracking.md Updates references from implementation notes to durable design notes.
AGENTS.md Updates canonical skill references, paths, and adapter/test layout guidance.
.github/skills/run-tests/SKILL.md New: canonical pytest invocation skill.
.github/skills/run-linters/SKILL.md New: canonical linter suite skill.
.github/skills/format-markdown/SKILL.md New: canonical markdown lint/format skill.
.github/skills/format-code/SKILL.md New: canonical Black formatting skill.
.github/skills/format-code-run-tests/SKILL.md Deleted: replaced by modular skills.
.github/prompts/PLAN.md New: planning prompt for updating implementation plan/notes.
.github/prompts/LEARN.md New: docs-only refinement prompt.
.github/prompts/BUILD.md Clarifies build prompt verification/testing/DRY requirements.
.github/prompts/BUGFIX.md New: test-first bugfix prompt.
.github/copilot-instructions.md Major update: commands, architecture, conventions, checklists.
.github/CODEOWNERS Adds explicit ownership for .github/ subtree.
.flake8 Adds E203 to ignored errors.

Comment on lines 73 to 78
@@ -76,6 +77,7 @@
"Updates the offer status to TENTATIVELY_REJECTED and the report "
"status to INVALID."
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The invalidate-report endpoint description says it updates the offer status to TENTATIVELY_REJECTED, but the current implementation path appears to persist only ParticipantStatus (RM state) and no longer tracks offer status (the OfferStatus/OfferStatusEnum models remain but are unused). Please either restore offer-status persistence or update the endpoint description to reflect the actual persisted state changes.

Copilot uses AI. Check for mistakes.
Comment on lines 224 to +228
"""
Transition report to RM.INVALID and offer to TENTATIVELY_REJECTED.

Updates both report status (RM.INVALID) and offer status (TENTATIVELY_REJECTED)
in the status layer. Logs state transitions at INFO level.
Updates report status (RM.INVALID) in the DataLayer.
Logs state transitions at INFO level.
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring still says TransitionRMtoInvalid transitions the offer to TENTATIVELY_REJECTED, but the implementation no longer persists any offer-status state (it only writes a ParticipantStatus RM record). Please update the docstring to reflect the actual behavior (or reintroduce offer-status persistence if required).

Copilot uses AI. Check for mistakes.
Comment on lines +39 to +41
try:
dl.read("")
return {"status": "ok"}
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/health/ready probes the DataLayer by calling dl.read(""). An empty ID isn’t guaranteed to be valid for all DataLayer implementations and may either always succeed (returning None) or always fail, making the readiness signal unreliable across adapters. Consider probing via a port-level operation that is explicitly supported (e.g., dl.get(None, <sentinel_id>) if get() is the intended cross-table lookup) or introduce a dedicated ping()/health() method on the port so readiness semantics are consistent.

Copilot uses AI. Check for mistakes.
Comment on lines 101 to 107
description=(
"Triggers the reject-report behavior for the given actor. "
"Emits a Reject(Offer(VulnerabilityReport)) activity (RmCloseReportActivity) "
"and returns it in the response body (TB-04-001). "
"A non-empty note is required (TB-03-004). "
"Updates the offer status to REJECTED and the report status to CLOSED."
),
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reject-report endpoint description says it updates the offer status to REJECTED, but offer status is no longer persisted anywhere (only RM state via ParticipantStatus). Please align the route description with the current domain model/state persistence, or reintroduce offer-status tracking if it’s still required by the trigger semantics.

Copilot uses AI. Check for mistakes.
Comment on lines 136 to 138
"endpoint closes a report that has already progressed through the RM "
"lifecycle. Returns HTTP 409 if the report is already CLOSED."
),
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The close-report endpoint description still claims it “updates the offer status to REJECTED”, but offer status is no longer persisted anywhere in the codebase (RM state is tracked via ParticipantStatus). Please update this description to reflect actual side effects, or reintroduce offer-status persistence if it’s still a requirement.

Copilot uses AI. Check for mistakes.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot open a new pull request to apply changes based on this feedback

Copy link
Contributor

Copilot AI commented Mar 24, 2026

@ahouseholder I've opened a new pull request, #332, to work on those changes. Once the pull request is ready, I'll request review from you.

@ahouseholder
Copy link
Contributor Author

@copilot open a new pull request to apply changes based on the comments in this thread

Copy link
Contributor

Copilot AI commented Mar 24, 2026

@ahouseholder I've opened a new pull request, #333, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 2 commits March 24, 2026 16:26
…r descriptions, nodes docstring, health probe ping

Co-authored-by: ahouseholder <2594236+ahouseholder@users.noreply.github.com>
Agent-Logs-Url: https://github.com/CERTCC/Vultron/sessions/2a977821-d19d-4e43-bfc9-23989471a5cc
Fix PR #331 review feedback: hoist test imports, fix stale docs, improve health probe
@ahouseholder ahouseholder merged commit 2410cce into main Mar 24, 2026
6 checks passed
@ahouseholder ahouseholder deleted the transitions-part-2 branch March 24, 2026 16:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request tech/backend Changes to modules, libraries, etc. tech/environment Changes to project infrastructure

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants