docs(requirements): restore approved REQ bytes and add REQ-001 traceability artifacts
Co-authored-by: genichin <4282227+genichin@users.noreply.github.com>
This commit is contained in:
co-authored by
genichin
parent
a36b451a3d
commit
f193aa6da3
@@ -588,4 +588,4 @@ API가 수용한 최대 8자리 소수의 `amount`와 `tax`는 PostgreSQL 저장
|
||||
|
||||
- 상태: `approved`
|
||||
- 승인 주체: `genichin`
|
||||
- 승인 근거: 이 대화에서 `REQ-001` revision `1.0` 승인과 비-`DIVIDEND` `confirm_duplicate=false` 허용/`true` HTTP 422 결정을 명시적으로 확정함 (`#31` OQ-001 결정 B와 정합)
|
||||
- 승인 근거: 이 대화에서 `REQ-001` 승인과 OQ-001 선택지 A를 명시적으로 확정함
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
# REQ-001 Test Catalog
|
||||
|
||||
Test ID: TC-REQ-001-001
|
||||
Verifies:
|
||||
- REQ-001.01-AC01
|
||||
- REQ-001.02-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_dividend_updates_only_profit_buffer_and_records_executed_at_and_tax`, `tests/test_v1_portfolios_manual_ledger.py::test_dividend_requires_executed_at_and_rejects_fee_field`, `tests/test_v1_portfolios_manual_ledger.py::test_dividend_rejects_sub_minimum_numeric_precision`, `tests/test_v1_portfolios_manual_ledger.py::test_dividend_rejects_amount_exceeding_numeric_20_8`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-002
|
||||
Verifies:
|
||||
- REQ-001.02-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_dividend_requires_executed_at_and_rejects_fee_field`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-003
|
||||
Verifies:
|
||||
- REQ-001.02-AC01
|
||||
- REQ-001.07-AC01
|
||||
Test reference: `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_dividend_precision_and_reversal_round_trip_on_real_postgres`, `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_dividend_large_integer_with_8dp_is_rejected_to_protect_double_snapshot`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-004
|
||||
Verifies:
|
||||
- REQ-001.02-AC01
|
||||
- REQ-001.08-AC01
|
||||
Test reference: `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_existing_high_precision_snapshot_still_allows_legacy_manual_actions`, `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_large_invest_and_large_dividend_tax_metadata_are_accepted_when_snapshot_is_safe`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-005
|
||||
Verifies:
|
||||
- REQ-001.03-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_dividend_updates_only_profit_buffer_and_records_executed_at_and_tax`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-006
|
||||
Verifies:
|
||||
- REQ-001.04-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_unified_ledger_includes_dividend_fields`, `tests/test_v1_portfolios_manual_ledger.py::test_unified_ledger_openapi_contains_nullable_amount`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-007
|
||||
Verifies:
|
||||
- REQ-001.05-AC01
|
||||
- REQ-001.05-AC02
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_dividend_duplicate_requires_confirmation`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-008
|
||||
Verifies:
|
||||
- REQ-001.05-AC03
|
||||
Test reference: `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_cold_repositories_concurrent_dividend_requests_follow_duplicate_contract`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-009
|
||||
Verifies:
|
||||
- REQ-001.06-AC01
|
||||
- REQ-001.07-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_dividend_reversal_decreases_profit_buffer`, `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_dividend_precision_and_reversal_round_trip_on_real_postgres`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-010
|
||||
Verifies:
|
||||
- REQ-001.07-AC01
|
||||
Test reference: `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_large_existing_buffer_plus_min_dividend_is_rejected_before_snapshot_divergence`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-011
|
||||
Verifies:
|
||||
- REQ-001.08-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_confirm_duplicate_false_is_accepted_for_non_dividend_actions`, `tests/test_v1_portfolios_manual_ledger.py::test_confirm_duplicate_true_is_rejected_for_non_dividend_actions`
|
||||
Automated: true
|
||||
|
||||
Test ID: TC-REQ-001-012
|
||||
Verifies:
|
||||
- REQ-001.09-AC01
|
||||
Test reference: `tests/test_v1_portfolios_manual_ledger.py::test_manual_write_rejects_service_token`, `tests/test_v1_portfolios_manual_ledger.py::test_owner_mismatch_returns_403`, `tests/test_v1_portfolios_manual_ledger.py::test_daemon_managed_requires_confirmation_then_records_evidence`, `tests/test_v1_portfolios_manual_ledger.py::test_manual_ledger_conflict_message_is_sanitized`
|
||||
Automated: true
|
||||
@@ -0,0 +1,64 @@
|
||||
# REQ-001 Test Evidence
|
||||
|
||||
## Evidence Batch: local API regression run
|
||||
|
||||
Requirement revision: `REQ-001@1.0`
|
||||
Commit: `a36b451a3d3180cdd5c7484147a73be749d749a3`
|
||||
Environment: `local sandbox / pytest / fake repository`
|
||||
Executed at: `2026-09-09T11:57:41Z`
|
||||
Run selector: `pytest -q -o addopts='' tests/test_v1_portfolios_manual_ledger.py`
|
||||
Run result: `26 passed`
|
||||
|
||||
Test ID: TC-REQ-001-001
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-002
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-005
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-006
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-007
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-009
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-011
|
||||
Result: PASS
|
||||
|
||||
Test ID: TC-REQ-001-012
|
||||
Result: PASS
|
||||
|
||||
## Evidence Batch: real PostgreSQL concurrency regression
|
||||
|
||||
Requirement revision: `REQ-001@1.0`
|
||||
Commit: `a36b451a3d3180cdd5c7484147a73be749d749a3`
|
||||
Environment: `disposable PostgreSQL / independent re-review run`
|
||||
Executed at: `2026-09-09T11:57:41Z`
|
||||
Run selector: `tests/test_bat025_portfolio_ledger_manual_metadata_migration.py::test_cold_repositories_concurrent_dividend_requests_follow_duplicate_contract`
|
||||
Run result: `1 passed` (5회 반복 모두 `성공 1 + 중복 거부 1`, ledger 1건, `profit_buffer=1`)
|
||||
|
||||
Test ID: TC-REQ-001-008
|
||||
Result: PASS
|
||||
|
||||
## Evidence Batch: PostgreSQL-dependent cases in local sandbox
|
||||
|
||||
Requirement revision: `REQ-001@1.0`
|
||||
Commit: `a36b451a3d3180cdd5c7484147a73be749d749a3`
|
||||
Environment: `local sandbox / PostgreSQL DSN 미설정`
|
||||
Executed at: `2026-09-09T11:57:41Z`
|
||||
Run selector: `pytest -q -o addopts='' tests/test_bat025_portfolio_ledger_manual_metadata_migration.py`
|
||||
Run result: `9 skipped`
|
||||
|
||||
Test ID: TC-REQ-001-003
|
||||
Result: BLOCKED
|
||||
|
||||
Test ID: TC-REQ-001-004
|
||||
Result: BLOCKED
|
||||
|
||||
Test ID: TC-REQ-001-010
|
||||
Result: BLOCKED
|
||||
Reference in New Issue
Block a user