source_monitor 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.claude/commands/release.md +45 -22
- data/.claude/skills/sm-configure/SKILL.md +10 -1
- data/.claude/skills/sm-configure/reference/configuration-reference.md +44 -0
- data/.claude/skills/sm-host-setup/reference/initializer-template.md +17 -0
- data/.claude/skills/sm-host-setup/reference/setup-checklist.md +2 -0
- data/.claude/skills/sm-job/reference/job-conventions.md +26 -0
- data/.claude/skills/sm-upgrade/reference/version-history.md +22 -0
- data/.gitignore +10 -0
- data/AGENTS.md +1 -1
- data/CHANGELOG.md +56 -0
- data/CLAUDE.md +11 -5
- data/Gemfile.lock +1 -1
- data/README.md +6 -4
- data/VERSION +1 -1
- data/app/assets/builds/source_monitor/application.css +43 -0
- data/app/assets/builds/source_monitor/application.js +127 -0
- data/app/assets/builds/source_monitor/application.js.map +3 -3
- data/app/assets/javascripts/source_monitor/application.js +2 -0
- data/app/assets/javascripts/source_monitor/controllers/notification_container_controller.js +138 -0
- data/app/assets/javascripts/source_monitor/controllers/notification_controller.js +11 -0
- data/app/controllers/source_monitor/source_favicon_fetches_controller.rb +38 -0
- data/app/controllers/source_monitor/sources_controller.rb +11 -0
- data/app/helpers/source_monitor/application_helper.rb +51 -0
- data/app/jobs/source_monitor/favicon_fetch_job.rb +71 -0
- data/app/jobs/source_monitor/import_opml_job.rb +9 -0
- data/app/jobs/source_monitor/source_health_check_job.rb +10 -0
- data/app/models/source_monitor/source.rb +2 -0
- data/app/views/layouts/source_monitor/application.html.erb +23 -2
- data/app/views/source_monitor/shared/_toast.html.erb +1 -0
- data/app/views/source_monitor/sources/_details.html.erb +34 -5
- data/app/views/source_monitor/sources/_row.html.erb +11 -6
- data/config/routes.rb +1 -0
- data/docs/configuration.md +1 -1
- data/docs/upgrade.md +22 -0
- data/lib/generators/source_monitor/install/templates/source_monitor.rb.tt +15 -1
- data/lib/source_monitor/configuration/favicons_settings.rb +42 -0
- data/lib/source_monitor/configuration/http_settings.rb +1 -1
- data/lib/source_monitor/configuration/scraping_settings.rb +1 -1
- data/lib/source_monitor/configuration.rb +3 -1
- data/lib/source_monitor/favicons/discoverer.rb +196 -0
- data/lib/source_monitor/fetching/feed_fetcher/source_updater.rb +21 -0
- data/lib/source_monitor/fetching/feed_fetcher.rb +1 -0
- data/lib/source_monitor/http.rb +5 -3
- data/lib/source_monitor/version.rb +1 -1
- data/lib/source_monitor.rb +4 -0
- data/lib/tasks/test_fast.rake +11 -0
- data/source_monitor.gemspec +1 -1
- metadata +7 -93
- data/.vbw-planning/PROJECT.md +0 -51
- data/.vbw-planning/ROADMAP.md +0 -32
- data/.vbw-planning/SHIPPED.md +0 -63
- data/.vbw-planning/STATE.md +0 -27
- data/.vbw-planning/codebase/ARCHITECTURE.md +0 -147
- data/.vbw-planning/codebase/CONCERNS.md +0 -99
- data/.vbw-planning/codebase/CONVENTIONS.md +0 -97
- data/.vbw-planning/codebase/DEPENDENCIES.md +0 -100
- data/.vbw-planning/codebase/INDEX.md +0 -86
- data/.vbw-planning/codebase/META.md +0 -42
- data/.vbw-planning/codebase/PATTERNS.md +0 -262
- data/.vbw-planning/codebase/STACK.md +0 -101
- data/.vbw-planning/codebase/STRUCTURE.md +0 -324
- data/.vbw-planning/codebase/TESTING.md +0 -154
- data/.vbw-planning/config.json +0 -53
- data/.vbw-planning/discovery.json +0 -26
- data/.vbw-planning/milestones/default/ROADMAP.md +0 -115
- data/.vbw-planning/milestones/default/STATE.md +0 -82
- data/.vbw-planning/milestones/default/phases/01-coverage-analysis-quick-wins/PLAN-01-SUMMARY.md +0 -56
- data/.vbw-planning/milestones/default/phases/01-coverage-analysis-quick-wins/PLAN-01.md +0 -187
- data/.vbw-planning/milestones/default/phases/01-coverage-analysis-quick-wins/PLAN-02-SUMMARY.md +0 -64
- data/.vbw-planning/milestones/default/phases/01-coverage-analysis-quick-wins/PLAN-02.md +0 -137
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-01-SUMMARY.md +0 -67
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-01.md +0 -142
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-02-SUMMARY.md +0 -64
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-02.md +0 -138
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-03-SUMMARY.md +0 -85
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-03.md +0 -147
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-04-SUMMARY.md +0 -63
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-04.md +0 -129
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-05-SUMMARY.md +0 -74
- data/.vbw-planning/milestones/default/phases/02-critical-path-test-coverage/PLAN-05.md +0 -154
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/03-VERIFICATION-wave1.md +0 -303
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/03-VERIFICATION.md +0 -510
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-01-SUMMARY.md +0 -61
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-01.md +0 -161
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-02-SUMMARY.md +0 -66
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-02.md +0 -132
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-03-SUMMARY.md +0 -59
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-03.md +0 -171
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-04-SUMMARY.md +0 -56
- data/.vbw-planning/milestones/default/phases/03-large-file-refactoring/PLAN-04.md +0 -152
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/04-CONTEXT.md +0 -33
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/PLAN-01-SUMMARY.md +0 -42
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/PLAN-01.md +0 -119
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/PLAN-02-SUMMARY.md +0 -52
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/PLAN-02.md +0 -195
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/PLAN-03-SUMMARY.md +0 -79
- data/.vbw-planning/milestones/default/phases/04-code-quality-conventions-cleanup/PLAN-03.md +0 -130
- data/.vbw-planning/milestones/generator-enhancements/REQUIREMENTS.md +0 -72
- data/.vbw-planning/milestones/generator-enhancements/ROADMAP.md +0 -125
- data/.vbw-planning/milestones/generator-enhancements/SHIPPED.md +0 -40
- data/.vbw-planning/milestones/generator-enhancements/STATE.md +0 -43
- data/.vbw-planning/milestones/generator-enhancements/phases/01-generator-steps/01-CONTEXT.md +0 -33
- data/.vbw-planning/milestones/generator-enhancements/phases/01-generator-steps/01-VERIFICATION.md +0 -86
- data/.vbw-planning/milestones/generator-enhancements/phases/01-generator-steps/PLAN-01-SUMMARY.md +0 -61
- data/.vbw-planning/milestones/generator-enhancements/phases/01-generator-steps/PLAN-01.md +0 -380
- data/.vbw-planning/milestones/generator-enhancements/phases/02-verification/02-VERIFICATION.md +0 -78
- data/.vbw-planning/milestones/generator-enhancements/phases/02-verification/PLAN-01-SUMMARY.md +0 -46
- data/.vbw-planning/milestones/generator-enhancements/phases/02-verification/PLAN-01.md +0 -500
- data/.vbw-planning/milestones/generator-enhancements/phases/03-docs-alignment/03-VERIFICATION.md +0 -89
- data/.vbw-planning/milestones/generator-enhancements/phases/03-docs-alignment/PLAN-01-SUMMARY.md +0 -48
- data/.vbw-planning/milestones/generator-enhancements/phases/03-docs-alignment/PLAN-01.md +0 -456
- data/.vbw-planning/milestones/generator-enhancements/phases/04-dashboard-ux/04-VERIFICATION.md +0 -129
- data/.vbw-planning/milestones/generator-enhancements/phases/04-dashboard-ux/PLAN-01-SUMMARY.md +0 -70
- data/.vbw-planning/milestones/generator-enhancements/phases/04-dashboard-ux/PLAN-01.md +0 -747
- data/.vbw-planning/milestones/generator-enhancements/phases/05-active-storage-images/05-VERIFICATION.md +0 -156
- data/.vbw-planning/milestones/generator-enhancements/phases/05-active-storage-images/PLAN-01-SUMMARY.md +0 -69
- data/.vbw-planning/milestones/generator-enhancements/phases/05-active-storage-images/PLAN-01.md +0 -455
- data/.vbw-planning/milestones/generator-enhancements/phases/05-active-storage-images/PLAN-02-SUMMARY.md +0 -39
- data/.vbw-planning/milestones/generator-enhancements/phases/05-active-storage-images/PLAN-02.md +0 -488
- data/.vbw-planning/milestones/generator-enhancements/phases/06-netflix-feed-fix/06-VERIFICATION.md +0 -100
- data/.vbw-planning/milestones/generator-enhancements/phases/06-netflix-feed-fix/PLAN-01-SUMMARY.md +0 -37
- data/.vbw-planning/milestones/generator-enhancements/phases/06-netflix-feed-fix/PLAN-01.md +0 -345
- data/.vbw-planning/milestones/upgrade-assurance/REQUIREMENTS.md +0 -80
- data/.vbw-planning/milestones/upgrade-assurance/ROADMAP.md +0 -75
- data/.vbw-planning/milestones/upgrade-assurance/STATE.md +0 -29
- data/.vbw-planning/milestones/upgrade-assurance/phases/01-upgrade-command/01-VERIFICATION.md +0 -144
- data/.vbw-planning/milestones/upgrade-assurance/phases/01-upgrade-command/PLAN-01-SUMMARY.md +0 -43
- data/.vbw-planning/milestones/upgrade-assurance/phases/01-upgrade-command/PLAN-01.md +0 -405
- data/.vbw-planning/milestones/upgrade-assurance/phases/02-config-deprecation/PLAN-01-SUMMARY.md +0 -27
- data/.vbw-planning/milestones/upgrade-assurance/phases/02-config-deprecation/PLAN-01.md +0 -303
- data/.vbw-planning/milestones/upgrade-assurance/phases/03-upgrade-skill-docs/03-VERIFICATION.md +0 -380
- data/.vbw-planning/milestones/upgrade-assurance/phases/03-upgrade-skill-docs/PLAN-01-SUMMARY.md +0 -36
- data/.vbw-planning/milestones/upgrade-assurance/phases/03-upgrade-skill-docs/PLAN-01.md +0 -652
- data/.vbw-planning/phases/01-aia-certificate-resolution/.context-dev.md +0 -17
- data/.vbw-planning/phases/01-aia-certificate-resolution/PLAN-01-SUMMARY.md +0 -26
- data/.vbw-planning/phases/01-aia-certificate-resolution/PLAN-01.md +0 -71
- data/.vbw-planning/phases/01-aia-certificate-resolution/PLAN-02-SUMMARY.md +0 -16
- data/.vbw-planning/phases/01-aia-certificate-resolution/PLAN-02.md +0 -56
- data/.vbw-planning/phases/01-aia-certificate-resolution/PLAN-03-SUMMARY.md +0 -17
- data/.vbw-planning/phases/01-aia-certificate-resolution/PLAN-03.md +0 -98
|
@@ -1,510 +0,0 @@
|
|
|
1
|
-
# Phase 3 Final Integration Verification Report
|
|
2
|
-
|
|
3
|
-
**Generated:** 2026-02-10
|
|
4
|
-
**Tier:** high
|
|
5
|
-
**Plans Verified:** PLAN-01, PLAN-02, PLAN-03, PLAN-04
|
|
6
|
-
**Wave:** Final Integration
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Executive Summary
|
|
11
|
-
|
|
12
|
-
**Result:** PARTIAL - 3 of 4 plans complete
|
|
13
|
-
|
|
14
|
-
**Status Breakdown:**
|
|
15
|
-
- **PLAN-01** (extract-feed-fetcher): COMPLETE ✓
|
|
16
|
-
- **PLAN-02** (extract-configuration-settings): COMPLETE ✓
|
|
17
|
-
- **PLAN-03** (extract-import-sessions-controller): COMPLETE ✓
|
|
18
|
-
- **PLAN-04** (fix-log-entry-and-autoloading): NOT STARTED ✗
|
|
19
|
-
|
|
20
|
-
**Test Suite:** PASS - 760 runs, 2626 assertions, 0 failures, 0 errors, 0 skips
|
|
21
|
-
|
|
22
|
-
**Phase Success Criteria:**
|
|
23
|
-
1. No single file exceeds 300 lines: **PARTIAL** (3/3 target files under 300; Plan 04 not executed)
|
|
24
|
-
2. All existing tests pass: **PASS** (full suite green)
|
|
25
|
-
3. Public API unchanged: **PASS** (all plan-specific tests pass)
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Must-Have Checks
|
|
30
|
-
|
|
31
|
-
### PLAN-01: extract-feed-fetcher ✓ COMPLETE
|
|
32
|
-
|
|
33
|
-
| # | Truth | Status | Evidence |
|
|
34
|
-
|---|-------|--------|----------|
|
|
35
|
-
| 1 | FeedFetcher fewer than 300 lines | PASS | 285 lines (target: <300) |
|
|
36
|
-
| 2 | FeedFetcher tests exit 0 | PASS | 64 runs, 271 assertions, 0 failures, 0 errors |
|
|
37
|
-
| 3 | Full suite exits 0 | PASS | 760 runs, 2626 assertions, 0 failures, 0 errors |
|
|
38
|
-
| 4 | No test files renamed/removed | PASS | feed_fetcher_test.rb unchanged |
|
|
39
|
-
| 5 | FeedFetcher syntax valid | PASS | `ruby -c` exits 0 |
|
|
40
|
-
| 6 | SourceUpdater syntax valid | PASS | `ruby -c` exits 0 |
|
|
41
|
-
| 7 | AdaptiveInterval syntax valid | PASS | `ruby -c` exits 0 |
|
|
42
|
-
| 8 | EntryProcessor syntax valid | PASS | `ruby -c` exits 0 |
|
|
43
|
-
|
|
44
|
-
**Score:** 8/8 checks PASS
|
|
45
|
-
|
|
46
|
-
### PLAN-02: extract-configuration-settings ✓ COMPLETE
|
|
47
|
-
|
|
48
|
-
| # | Truth | Status | Evidence |
|
|
49
|
-
|---|-------|--------|----------|
|
|
50
|
-
| 1 | Configuration fewer than 120 lines | PASS | 87 lines (target: <120) |
|
|
51
|
-
| 2 | Configuration tests exit 0 | PASS | 81 runs, 178 assertions, 0 failures, 0 errors |
|
|
52
|
-
| 3 | Full suite exits 0 | PASS | 760 runs, 2626 assertions, 0 failures, 0 errors |
|
|
53
|
-
| 4 | At least 10 .rb files in configuration/ | PASS | 12 files found |
|
|
54
|
-
| 5 | Configuration syntax valid | PASS | `ruby -c` exits 0 |
|
|
55
|
-
| 6 | All nested classes extracted | PASS | 0 nested class definitions remain |
|
|
56
|
-
|
|
57
|
-
**Score:** 6/6 checks PASS
|
|
58
|
-
|
|
59
|
-
### PLAN-03: extract-import-sessions-controller ✓ COMPLETE
|
|
60
|
-
|
|
61
|
-
| # | Truth | Status | Evidence |
|
|
62
|
-
|---|-------|--------|----------|
|
|
63
|
-
| 1 | ImportSessionsController fewer than 300 lines | PASS | 295 lines (target: <300) |
|
|
64
|
-
| 2 | ImportSessions tests exit 0 | PASS | 29 runs, 133 assertions, 0 failures, 0 errors |
|
|
65
|
-
| 3 | Full suite exits 0 | PASS | 760 runs, 2626 assertions, 0 failures, 0 errors |
|
|
66
|
-
| 4 | At least 4 .rb files in import_sessions/ | PASS | 4 concern files found |
|
|
67
|
-
| 5 | ImportSessionsController syntax valid | PASS | `ruby -c` exits 0 |
|
|
68
|
-
| 6 | No test files renamed/removed | PASS | import_sessions_controller_test.rb unchanged |
|
|
69
|
-
|
|
70
|
-
**Score:** 6/6 checks PASS
|
|
71
|
-
|
|
72
|
-
### PLAN-04: fix-log-entry-and-autoloading ✗ NOT STARTED
|
|
73
|
-
|
|
74
|
-
| # | Truth | Status | Evidence |
|
|
75
|
-
|---|-------|--------|----------|
|
|
76
|
-
| 1 | LogEntry hard-coded table_name removed | FAIL | Line 5 still has `self.table_name = "sourcemon_log_entries"` |
|
|
77
|
-
| 2 | ModelExtensions.register present | PASS | Line 17 has register call |
|
|
78
|
-
| 3 | LogEntry tests exit 0 | PASS | 1 run, 4 assertions, 0 failures, 0 errors |
|
|
79
|
-
| 4 | Fewer than 15 require statements | FAIL | 67 require statements (target: <15) |
|
|
80
|
-
| 5 | Full suite exits 0 | PASS | 760 runs, 2626 assertions, 0 failures, 0 errors |
|
|
81
|
-
| 6 | RuboCop passes | PASS | Would pass (no changes made yet) |
|
|
82
|
-
|
|
83
|
-
**Score:** 3/6 checks PASS
|
|
84
|
-
|
|
85
|
-
**Requirements Not Satisfied:**
|
|
86
|
-
- REQ-11: LogEntry table name fix (hard-coded value still present)
|
|
87
|
-
- REQ-12: Autoloading conversion (67 eager requires remain, 0 autoload declarations)
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Artifact Checks
|
|
92
|
-
|
|
93
|
-
### PLAN-01: extract-feed-fetcher ✓
|
|
94
|
-
|
|
95
|
-
| Artifact | Exists | Line Count | Status |
|
|
96
|
-
|----------|--------|------------|--------|
|
|
97
|
-
| feed_fetcher/source_updater.rb | YES | 200 | PASS |
|
|
98
|
-
| feed_fetcher/adaptive_interval.rb | YES | 141 | PASS |
|
|
99
|
-
| feed_fetcher/entry_processor.rb | YES | 89 | PASS |
|
|
100
|
-
| feed_fetcher.rb (slimmed) | YES | 285 | PASS |
|
|
101
|
-
|
|
102
|
-
**Total extracted lines:** 430 (3 sub-modules)
|
|
103
|
-
**Reduction:** 627 → 285 lines (54% reduction)
|
|
104
|
-
|
|
105
|
-
### PLAN-02: extract-configuration-settings ✓
|
|
106
|
-
|
|
107
|
-
| Artifact | Exists | Line Count | Status |
|
|
108
|
-
|----------|--------|------------|--------|
|
|
109
|
-
| configuration/http_settings.rb | YES | 43 | PASS |
|
|
110
|
-
| configuration/fetching_settings.rb | YES | 27 | PASS |
|
|
111
|
-
| configuration/health_settings.rb | YES | 27 | PASS |
|
|
112
|
-
| configuration/realtime_settings.rb | YES | 95 | PASS |
|
|
113
|
-
| configuration/scraping_settings.rb | YES | 39 | PASS |
|
|
114
|
-
| configuration/retention_settings.rb | YES | 45 | PASS |
|
|
115
|
-
| configuration/scraper_registry.rb | YES | 67 | PASS |
|
|
116
|
-
| configuration/events.rb | YES | 60 | PASS |
|
|
117
|
-
| configuration/models.rb | YES | 36 | PASS |
|
|
118
|
-
| configuration/model_definition.rb | YES | 108 | PASS |
|
|
119
|
-
| configuration/validation_definition.rb | YES | 32 | PASS |
|
|
120
|
-
| configuration/authentication_settings.rb | YES | 62 | PASS |
|
|
121
|
-
| configuration.rb (slimmed) | YES | 87 | PASS |
|
|
122
|
-
|
|
123
|
-
**Total extracted lines:** 641 (12 sub-files)
|
|
124
|
-
**Reduction:** 655 → 87 lines (87% reduction)
|
|
125
|
-
**Largest extracted file:** model_definition.rb (108 lines)
|
|
126
|
-
|
|
127
|
-
### PLAN-03: extract-import-sessions-controller ✓
|
|
128
|
-
|
|
129
|
-
| Artifact | Exists | Line Count | Status |
|
|
130
|
-
|----------|--------|------------|--------|
|
|
131
|
-
| import_sessions/opml_parser.rb | YES | 130 | PASS |
|
|
132
|
-
| import_sessions/entry_annotation.rb | YES | 187 | PASS |
|
|
133
|
-
| import_sessions/health_check_management.rb | YES | 112 | PASS |
|
|
134
|
-
| import_sessions/bulk_configuration.rb | YES | 106 | PASS |
|
|
135
|
-
| import_sessions_controller.rb (slimmed) | YES | 295 | PASS |
|
|
136
|
-
|
|
137
|
-
**Total extracted lines:** 535 (4 concerns)
|
|
138
|
-
**Reduction:** 792 → 295 lines (63% reduction)
|
|
139
|
-
|
|
140
|
-
### PLAN-04: fix-log-entry-and-autoloading ✗
|
|
141
|
-
|
|
142
|
-
| Artifact | Exists | Expected State | Actual State | Status |
|
|
143
|
-
|----------|--------|----------------|--------------|--------|
|
|
144
|
-
| log_entry.rb | YES | No hard-coded table_name | Has `self.table_name = "..."` on line 5 | FAIL |
|
|
145
|
-
| source_monitor.rb | YES | <15 requires, 40+ autoloads | 67 requires, 0 autoloads | FAIL |
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Key Link Checks
|
|
150
|
-
|
|
151
|
-
| Plan | From | To | Via | Status |
|
|
152
|
-
|------|------|----|----|--------|
|
|
153
|
-
| PLAN-01 | REQ-08 | FeedFetcher extraction | 3 sub-modules created | PASS ✓ |
|
|
154
|
-
| PLAN-01 | Public API | FeedFetcher.new(source:).call | All tests pass | PASS ✓ |
|
|
155
|
-
| PLAN-02 | REQ-09 | Configuration extraction | 12 nested classes extracted | PASS ✓ |
|
|
156
|
-
| PLAN-02 | Public API | SourceMonitor.configure {...} | All tests pass | PASS ✓ |
|
|
157
|
-
| PLAN-03 | REQ-10 | ImportSessions extraction | 4 concerns created | PASS ✓ |
|
|
158
|
-
| PLAN-03 | Public API | Wizard routes/step handling | All tests pass | PASS ✓ |
|
|
159
|
-
| PLAN-04 | REQ-11 | LogEntry table name fix | ModelExtensions.register | FAIL ✗ |
|
|
160
|
-
| PLAN-04 | REQ-12 | Autoloading | Replace requires with autoload | FAIL ✗ |
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Cross-Plan Integration Analysis
|
|
165
|
-
|
|
166
|
-
### Module Loading Chain
|
|
167
|
-
|
|
168
|
-
**FeedFetcher Sub-modules:**
|
|
169
|
-
- `feed_fetcher.rb` (line 9-11) requires its sub-modules directly
|
|
170
|
-
- `lib/source_monitor.rb` (line 79) requires `feed_fetcher.rb` only
|
|
171
|
-
- ✓ Correct pattern: parent requires children, root requires parent
|
|
172
|
-
|
|
173
|
-
**Configuration Sub-files:**
|
|
174
|
-
- `configuration.rb` (line 4-15) requires its 12 sub-files directly
|
|
175
|
-
- `lib/source_monitor.rb` (line 41) requires `configuration.rb` only
|
|
176
|
-
- ✓ Correct pattern: parent requires children, root requires parent
|
|
177
|
-
|
|
178
|
-
**ImportSessions Concerns:**
|
|
179
|
-
- `import_sessions_controller.rb` (line 10-13) includes 4 concerns
|
|
180
|
-
- Rails autoloads concerns from `app/controllers/source_monitor/import_sessions/`
|
|
181
|
-
- ✓ Correct pattern: Rails convention-based autoloading for app/ directory
|
|
182
|
-
|
|
183
|
-
### Shared Interface Verification
|
|
184
|
-
|
|
185
|
-
**No direct coupling between extracted plans:**
|
|
186
|
-
- FeedFetcher does NOT reference Configuration classes directly
|
|
187
|
-
- Configuration does NOT reference FeedFetcher classes
|
|
188
|
-
- ImportSessions does NOT reference FeedFetcher or Configuration internals
|
|
189
|
-
- ✓ Plans are independent and cohesive
|
|
190
|
-
|
|
191
|
-
**Indirect coupling through SourceMonitor module:**
|
|
192
|
-
- FeedFetcher uses `SourceMonitor.config.http` (stable API)
|
|
193
|
-
- ImportSessions uses `SourceMonitor::Source` and models (stable API)
|
|
194
|
-
- ✓ All indirect coupling through stable public APIs
|
|
195
|
-
|
|
196
|
-
### Autoloading Readiness (Plan 04)
|
|
197
|
-
|
|
198
|
-
**Current state:**
|
|
199
|
-
- All new files from Plans 01-03 are explicitly required by their parent files
|
|
200
|
-
- Parent files (feed_fetcher.rb, configuration.rb) are required by lib/source_monitor.rb
|
|
201
|
-
- ✓ All extracted modules are loadable via current require chain
|
|
202
|
-
|
|
203
|
-
**Plan 04 impact:**
|
|
204
|
-
- Will NOT affect Plans 01-03 extracted files (they're already required by parents)
|
|
205
|
-
- Will convert root-level requires in lib/source_monitor.rb to autoload
|
|
206
|
-
- Parent files (feed_fetcher.rb, configuration.rb) will remain as explicit requires
|
|
207
|
-
- ✓ Plans 01-03 work is compatible with Plan 04 autoloading strategy
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## RuboCop Verification
|
|
212
|
-
|
|
213
|
-
| Plan | Scope | Files Inspected | Offenses | Status |
|
|
214
|
-
|------|-------|-----------------|----------|--------|
|
|
215
|
-
| PLAN-01 | FeedFetcher + sub-modules | 4 | 0 | PASS ✓ |
|
|
216
|
-
| PLAN-02 | Configuration + sub-files | 13 | 0 | PASS ✓ |
|
|
217
|
-
| PLAN-03 | ImportSessions + concerns | 5 | 0 | PASS ✓ |
|
|
218
|
-
| **Total** | **All Wave 1 files** | **22** | **0** | **PASS ✓** |
|
|
219
|
-
|
|
220
|
-
**Command:** `bin/rubocop lib/source_monitor/fetching/feed_fetcher* lib/source_monitor/configuration* app/controllers/source_monitor/import_sessions*`
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Test Suite Results
|
|
225
|
-
|
|
226
|
-
### Full Suite (PARALLEL_WORKERS=1)
|
|
227
|
-
|
|
228
|
-
```
|
|
229
|
-
760 runs, 2626 assertions, 0 failures, 0 errors, 0 skips
|
|
230
|
-
Runtime: 130.30s
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**Comparison to Wave 1 verification:**
|
|
234
|
-
- Wave 1 (commit 01aa9d4): 760 runs, 4 failures, 7 errors (pre-existing issues)
|
|
235
|
-
- Final Integration (current): 760 runs, 0 failures, 0 errors
|
|
236
|
-
- ✓ Pre-existing test failures have been resolved independently
|
|
237
|
-
|
|
238
|
-
### Individual Plan Test Suites
|
|
239
|
-
|
|
240
|
-
| Plan | Test File | Runs | Assertions | Failures | Errors | Status |
|
|
241
|
-
|------|-----------|------|------------|----------|--------|--------|
|
|
242
|
-
| PLAN-01 | feed_fetcher_test.rb | 64 | 271 | 0 | 0 | PASS ✓ |
|
|
243
|
-
| PLAN-02 | configuration_test.rb | 81 | 178 | 0 | 0 | PASS ✓ |
|
|
244
|
-
| PLAN-03 | import_sessions_controller_test.rb | 29 | 133 | 0 | 0 | PASS ✓ |
|
|
245
|
-
| PLAN-04 | log_entry_test.rb | 1 | 4 | 0 | 0 | PASS ✓ |
|
|
246
|
-
| **Total** | **Plan-specific tests** | **175** | **586** | **0** | **0** | **PASS ✓** |
|
|
247
|
-
|
|
248
|
-
**Note:** LogEntry tests pass despite hard-coded table_name because the default prefix matches the hard-coded value. Plan 04 fix is about respecting custom prefixes, not breaking current functionality.
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## Public API Verification
|
|
253
|
-
|
|
254
|
-
### PLAN-01: FeedFetcher ✓
|
|
255
|
-
|
|
256
|
-
**Interface:** `FeedFetcher.new(source:).call` returns `Result` struct
|
|
257
|
-
|
|
258
|
-
**Verification:**
|
|
259
|
-
- All 64 FeedFetcher tests pass unchanged
|
|
260
|
-
- `Result`, `EntryProcessingResult`, `ResponseWrapper` structs remain in main file
|
|
261
|
-
- Sub-modules (SourceUpdater, AdaptiveInterval, EntryProcessor) are private
|
|
262
|
-
- Constants (MIN_FETCH_INTERVAL, etc.) accessible via main class
|
|
263
|
-
|
|
264
|
-
**Breaking changes:** NONE
|
|
265
|
-
|
|
266
|
-
### PLAN-02: Configuration ✓
|
|
267
|
-
|
|
268
|
-
**Interface:** `SourceMonitor.configure { |c| c.http.timeout = 30 }`
|
|
269
|
-
|
|
270
|
-
**Verification:**
|
|
271
|
-
- All 81 configuration tests pass unchanged
|
|
272
|
-
- `attr_accessor` and `attr_reader` declarations identical
|
|
273
|
-
- Nested classes accessible as `Configuration::HTTPSettings`, etc.
|
|
274
|
-
- Configuration file reduced from 655 → 87 lines
|
|
275
|
-
|
|
276
|
-
**Breaking changes:** NONE
|
|
277
|
-
|
|
278
|
-
### PLAN-03: ImportSessionsController ✓
|
|
279
|
-
|
|
280
|
-
**Interface:** RESTful wizard routes with 5-step flow
|
|
281
|
-
|
|
282
|
-
**Verification:**
|
|
283
|
-
- All 29 controller integration tests pass unchanged
|
|
284
|
-
- All wizard step handlers preserved in main controller
|
|
285
|
-
- Concerns (OpmlParser, EntryAnnotation, HealthCheckManagement, BulkConfiguration) are private
|
|
286
|
-
- Controller file reduced from 792 → 295 lines
|
|
287
|
-
|
|
288
|
-
**Breaking changes:** NONE
|
|
289
|
-
|
|
290
|
-
### PLAN-04: LogEntry ✗ (Not Started)
|
|
291
|
-
|
|
292
|
-
**Interface:** `LogEntry.table_name` respects `SourceMonitor.table_name_prefix`
|
|
293
|
-
|
|
294
|
-
**Current state:**
|
|
295
|
-
- Hard-coded `self.table_name = "sourcemon_log_entries"` overrides prefix
|
|
296
|
-
- `ModelExtensions.register` present but ineffective due to hard-coded value
|
|
297
|
-
- Tests pass with default prefix but would fail with custom prefix
|
|
298
|
-
|
|
299
|
-
**Breaking changes:** NONE (change not yet applied)
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## Files Exceeding 300 Lines
|
|
304
|
-
|
|
305
|
-
### Target Files (Phase 3 Plans 01-03)
|
|
306
|
-
|
|
307
|
-
| File | Original | Current | Status |
|
|
308
|
-
|------|----------|---------|--------|
|
|
309
|
-
| lib/source_monitor/fetching/feed_fetcher.rb | 627 | 285 | PASS ✓ |
|
|
310
|
-
| lib/source_monitor/configuration.rb | 655 | 87 | PASS ✓ |
|
|
311
|
-
| app/controllers/source_monitor/import_sessions_controller.rb | 792 | 295 | PASS ✓ |
|
|
312
|
-
|
|
313
|
-
**All target files under 300 lines:** YES ✓
|
|
314
|
-
|
|
315
|
-
### Other Files in Codebase (Reference)
|
|
316
|
-
|
|
317
|
-
Files exceeding 300 lines that are NOT targets for Phase 3:
|
|
318
|
-
|
|
319
|
-
| File | Lines | Phase | Notes |
|
|
320
|
-
|------|-------|-------|-------|
|
|
321
|
-
| lib/source_monitor/items/item_creator.rb | 601 | Future | Business logic, well-tested |
|
|
322
|
-
| lib/source_monitor/dashboard/queries.rb | 356 | Future | Query object, single responsibility |
|
|
323
|
-
| app/helpers/source_monitor/application_helper.rb | 346 | Future | View helpers, cohesive |
|
|
324
|
-
|
|
325
|
-
**Phase 3 does NOT require these files to be refactored.**
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
## Phase Success Criteria Assessment
|
|
330
|
-
|
|
331
|
-
### Criterion 1: No single file exceeds 300 lines
|
|
332
|
-
|
|
333
|
-
**Status:** PARTIAL
|
|
334
|
-
|
|
335
|
-
**Evidence:**
|
|
336
|
-
- ✓ FeedFetcher: 285 lines (was 627)
|
|
337
|
-
- ✓ Configuration: 87 lines (was 655)
|
|
338
|
-
- ✓ ImportSessionsController: 295 lines (was 792)
|
|
339
|
-
- ✗ Plan 04 not executed (LogEntry and autoloading changes not made)
|
|
340
|
-
|
|
341
|
-
**Assessment:** All Wave 1 target files are under 300 lines. Plan 04 does not create new large files, but must be executed for phase completion.
|
|
342
|
-
|
|
343
|
-
### Criterion 2: All existing tests pass without modification
|
|
344
|
-
|
|
345
|
-
**Status:** PASS ✓
|
|
346
|
-
|
|
347
|
-
**Evidence:**
|
|
348
|
-
- Full suite: 760 runs, 2626 assertions, 0 failures, 0 errors
|
|
349
|
-
- FeedFetcher tests: 64 runs, 0 failures (unchanged)
|
|
350
|
-
- Configuration tests: 81 runs, 0 failures (unchanged)
|
|
351
|
-
- ImportSessions tests: 29 runs, 0 failures (unchanged)
|
|
352
|
-
- LogEntry tests: 1 run, 0 failures (unchanged)
|
|
353
|
-
|
|
354
|
-
**Assessment:** No test files were modified. All tests pass with PARALLEL_WORKERS=1.
|
|
355
|
-
|
|
356
|
-
### Criterion 3: Public API remains unchanged
|
|
357
|
-
|
|
358
|
-
**Status:** PASS ✓
|
|
359
|
-
|
|
360
|
-
**Evidence:**
|
|
361
|
-
- FeedFetcher: `FeedFetcher.new(source:).call` interface unchanged
|
|
362
|
-
- Configuration: `SourceMonitor.configure { |c| ... }` interface unchanged
|
|
363
|
-
- ImportSessions: RESTful wizard routes unchanged
|
|
364
|
-
- LogEntry: Table name resolution unchanged (still uses hard-coded value)
|
|
365
|
-
|
|
366
|
-
**Assessment:** All public APIs verified by passing tests. No breaking changes introduced.
|
|
367
|
-
|
|
368
|
-
---
|
|
369
|
-
|
|
370
|
-
## Requirements Satisfaction
|
|
371
|
-
|
|
372
|
-
| ID | Requirement | Plan | Status | Evidence |
|
|
373
|
-
|----|-------------|------|--------|----------|
|
|
374
|
-
| REQ-08 | Extract FeedFetcher | PLAN-01 | COMPLETE ✓ | 3 sub-modules, 285 lines |
|
|
375
|
-
| REQ-09 | Extract Configuration | PLAN-02 | COMPLETE ✓ | 12 sub-files, 87 lines |
|
|
376
|
-
| REQ-10 | Extract ImportSessions | PLAN-03 | COMPLETE ✓ | 4 concerns, 295 lines |
|
|
377
|
-
| REQ-11 | Fix LogEntry table name | PLAN-04 | NOT STARTED ✗ | Hard-coded value remains |
|
|
378
|
-
| REQ-12 | Replace eager requires | PLAN-04 | NOT STARTED ✗ | 67 requires, 0 autoloads |
|
|
379
|
-
|
|
380
|
-
**Requirements satisfied:** 3/5 (60%)
|
|
381
|
-
|
|
382
|
-
---
|
|
383
|
-
|
|
384
|
-
## Line Count Summary
|
|
385
|
-
|
|
386
|
-
| Metric | Before | After | Reduction |
|
|
387
|
-
|--------|--------|-------|-----------|
|
|
388
|
-
| FeedFetcher (main) | 627 | 285 | 54% |
|
|
389
|
-
| Configuration (main) | 655 | 87 | 87% |
|
|
390
|
-
| ImportSessions (main) | 792 | 295 | 63% |
|
|
391
|
-
| **Total reduced** | **2074** | **667** | **68%** |
|
|
392
|
-
| **Extracted lines** | **—** | **1606** | **Split into 19 files** |
|
|
393
|
-
|
|
394
|
-
**New file breakdown:**
|
|
395
|
-
- FeedFetcher: 3 sub-modules (430 lines)
|
|
396
|
-
- Configuration: 12 sub-files (641 lines)
|
|
397
|
-
- ImportSessions: 4 concerns (535 lines)
|
|
398
|
-
|
|
399
|
-
**All extracted files under 300 lines:** YES ✓ (largest: 200 lines)
|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
## Summary
|
|
404
|
-
|
|
405
|
-
**Tier:** high
|
|
406
|
-
|
|
407
|
-
**Result:** PARTIAL - 3 of 4 plans complete
|
|
408
|
-
|
|
409
|
-
**Passed:** 20/26 must_have checks
|
|
410
|
-
- **PLAN-01:** 8/8 checks ✓
|
|
411
|
-
- **PLAN-02:** 6/6 checks ✓
|
|
412
|
-
- **PLAN-03:** 6/6 checks ✓
|
|
413
|
-
- **PLAN-04:** 3/6 checks (not executed) ✗
|
|
414
|
-
|
|
415
|
-
**Test Suite:** PASS ✓ (760 runs, 0 failures, 0 errors)
|
|
416
|
-
|
|
417
|
-
**RuboCop:** PASS ✓ (22 files, 0 offenses)
|
|
418
|
-
|
|
419
|
-
**Public APIs:** PASS ✓ (all unchanged, verified by tests)
|
|
420
|
-
|
|
421
|
-
**Cross-Plan Integration:** PASS ✓ (no coupling issues, all modules loadable)
|
|
422
|
-
|
|
423
|
-
**Phase Success Criteria:**
|
|
424
|
-
1. No file exceeds 300 lines: PARTIAL (3/3 targets met, Plan 04 not executed)
|
|
425
|
-
2. All tests pass: PASS ✓
|
|
426
|
-
3. Public API unchanged: PASS ✓
|
|
427
|
-
|
|
428
|
-
**Requirements Satisfied:**
|
|
429
|
-
- ✓ REQ-08: FeedFetcher extraction
|
|
430
|
-
- ✓ REQ-09: Configuration extraction
|
|
431
|
-
- ✓ REQ-10: ImportSessions extraction
|
|
432
|
-
- ✗ REQ-11: LogEntry table name fix (Plan 04)
|
|
433
|
-
- ✗ REQ-12: Autoloading conversion (Plan 04)
|
|
434
|
-
|
|
435
|
-
---
|
|
436
|
-
|
|
437
|
-
## Recommendations
|
|
438
|
-
|
|
439
|
-
### 1. Complete Plan 04 for Phase Closure
|
|
440
|
-
|
|
441
|
-
**Action:** Execute PLAN-04 (fix-log-entry-and-autoloading)
|
|
442
|
-
|
|
443
|
-
**Tasks:**
|
|
444
|
-
- Remove line 5 from `app/models/source_monitor/log_entry.rb` (hard-coded table_name)
|
|
445
|
-
- Convert 52+ require statements in `lib/source_monitor.rb` to autoload declarations
|
|
446
|
-
- Keep 10-15 boot-critical requires explicit (engine, configuration, model_extensions, etc.)
|
|
447
|
-
- Verify full test suite passes after autoload conversion
|
|
448
|
-
|
|
449
|
-
**Estimated effort:** 1-2 hours
|
|
450
|
-
|
|
451
|
-
**Blocking:** YES - Required for Phase 3 completion
|
|
452
|
-
|
|
453
|
-
### 2. Address Pre-existing Test Stability
|
|
454
|
-
|
|
455
|
-
**Observation:** Wave 1 verification reported 11 pre-existing test failures/errors. Current verification shows 0 failures.
|
|
456
|
-
|
|
457
|
-
**Action:** Document what resolved the issues (likely independent fixes during Phase 2 or early Phase 3)
|
|
458
|
-
|
|
459
|
-
**Blocking:** NO - Issues already resolved
|
|
460
|
-
|
|
461
|
-
### 3. Monitor Files Approaching 300 Lines
|
|
462
|
-
|
|
463
|
-
**Files to watch in future phases:**
|
|
464
|
-
- `lib/source_monitor/items/item_creator.rb` (601 lines)
|
|
465
|
-
- `lib/source_monitor/dashboard/queries.rb` (356 lines)
|
|
466
|
-
- `app/helpers/source_monitor/application_helper.rb` (346 lines)
|
|
467
|
-
|
|
468
|
-
**Recommendation:** Consider for Phase 4 or future refactoring roadmap
|
|
469
|
-
|
|
470
|
-
**Blocking:** NO - Not part of Phase 3 scope
|
|
471
|
-
|
|
472
|
-
### 4. Update ROADMAP.md Progress
|
|
473
|
-
|
|
474
|
-
**Action:** Mark Plans 01-03 as complete in `.vbw-planning/ROADMAP.md`
|
|
475
|
-
|
|
476
|
-
**Current state:**
|
|
477
|
-
```
|
|
478
|
-
- [ ] Plan 01: extract-feed-fetcher
|
|
479
|
-
- [ ] Plan 02: extract-configuration-settings
|
|
480
|
-
- [ ] Plan 03: extract-import-sessions-controller
|
|
481
|
-
- [ ] Plan 04: fix-log-entry-and-autoloading
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
**Updated state (after Plan 04):**
|
|
485
|
-
```
|
|
486
|
-
- [x] Plan 01: extract-feed-fetcher
|
|
487
|
-
- [x] Plan 02: extract-configuration-settings
|
|
488
|
-
- [x] Plan 03: extract-import-sessions-controller
|
|
489
|
-
- [x] Plan 04: fix-log-entry-and-autoloading
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
**Blocking:** NO - Documentation only
|
|
493
|
-
|
|
494
|
-
---
|
|
495
|
-
|
|
496
|
-
## Conclusion
|
|
497
|
-
|
|
498
|
-
**Phase 3 Wave 1 (Plans 01-03) is COMPLETE and VERIFIED.**
|
|
499
|
-
|
|
500
|
-
All target files are under 300 lines, all tests pass, all public APIs are unchanged, and RuboCop reports zero offenses. Cross-plan integration is healthy with no coupling issues.
|
|
501
|
-
|
|
502
|
-
**Plan 04 must be executed to satisfy Phase 3 success criteria and complete REQ-11 and REQ-12.**
|
|
503
|
-
|
|
504
|
-
The codebase is stable and ready for Plan 04 execution. No regressions were introduced by Wave 1 refactoring.
|
|
505
|
-
|
|
506
|
-
---
|
|
507
|
-
|
|
508
|
-
**Verification completed:** 2026-02-10
|
|
509
|
-
**Test suite runtime:** 130.30s (PARALLEL_WORKERS=1)
|
|
510
|
-
**Verified by:** VBW QA Agent
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# PLAN-01 Summary: extract-feed-fetcher
|
|
2
|
-
|
|
3
|
-
## Status: COMPLETE
|
|
4
|
-
|
|
5
|
-
## Commits
|
|
6
|
-
|
|
7
|
-
- **Hash:** `2f00274`
|
|
8
|
-
- **Message:** `refactor(plan-04): fix LogEntry table name and replace eager requires with autoloading` (mislabeled -- contains Plan 01 FeedFetcher extraction)
|
|
9
|
-
- **Files changed:** 4 files, 467 insertions, 379 deletions
|
|
10
|
-
|
|
11
|
-
## Tasks Completed
|
|
12
|
-
|
|
13
|
-
### Task 1: Extract SourceUpdater module
|
|
14
|
-
- Created `lib/source_monitor/fetching/feed_fetcher/source_updater.rb` (200 lines)
|
|
15
|
-
- Moved source state update methods: update_source_for_success, update_source_for_not_modified, update_source_for_failure, reset_retry_state!, apply_retry_strategy!, create_fetch_log, and related helpers
|
|
16
|
-
- FeedFetcher delegates to lazy-loaded source_updater instance
|
|
17
|
-
- All 64 FeedFetcher tests pass
|
|
18
|
-
|
|
19
|
-
### Task 2: Extract AdaptiveInterval module
|
|
20
|
-
- Created `lib/source_monitor/fetching/feed_fetcher/adaptive_interval.rb` (141 lines)
|
|
21
|
-
- Moved adaptive interval methods: apply_adaptive_interval!, compute_next_interval_seconds, and all config helpers
|
|
22
|
-
- Moved constants: MIN_FETCH_INTERVAL, MAX_FETCH_INTERVAL, INCREASE_FACTOR, etc.
|
|
23
|
-
- All 64 FeedFetcher tests pass
|
|
24
|
-
|
|
25
|
-
### Task 3: Extract EntryProcessor module
|
|
26
|
-
- Created `lib/source_monitor/fetching/feed_fetcher/entry_processor.rb` (89 lines)
|
|
27
|
-
- Moved entry processing methods: process_feed_entries, normalize_item_error, safe_entry_guid, safe_entry_title
|
|
28
|
-
- All 64 FeedFetcher tests pass
|
|
29
|
-
|
|
30
|
-
### Task 4: Wire extracted modules and verify final line count
|
|
31
|
-
- FeedFetcher.rb reduced to 285 lines (target: <300)
|
|
32
|
-
- Three sub-modules wired via require statements at top of feed_fetcher.rb
|
|
33
|
-
- Full suite: 760 runs, 0 failures, 0 errors
|
|
34
|
-
- RuboCop: 0 offenses
|
|
35
|
-
|
|
36
|
-
## Deviations
|
|
37
|
-
|
|
38
|
-
| ID | Description | Impact |
|
|
39
|
-
|----|-------------|--------|
|
|
40
|
-
| D-01 | Commit was mislabeled as "plan-04" instead of "plan-01" | No functional impact; commit contains correct FeedFetcher extraction work |
|
|
41
|
-
|
|
42
|
-
## Verification Results
|
|
43
|
-
|
|
44
|
-
| Check | Result |
|
|
45
|
-
|-------|--------|
|
|
46
|
-
| `wc -l lib/source_monitor/fetching/feed_fetcher.rb` | 285 lines (target: <300) |
|
|
47
|
-
| `wc -l feed_fetcher/source_updater.rb` | 200 lines |
|
|
48
|
-
| `wc -l feed_fetcher/adaptive_interval.rb` | 141 lines |
|
|
49
|
-
| `wc -l feed_fetcher/entry_processor.rb` | 89 lines |
|
|
50
|
-
| `bin/rails test test/lib/source_monitor/fetching/feed_fetcher_test.rb` | 64 runs, 271 assertions, 0 failures, 0 errors |
|
|
51
|
-
| `bin/rubocop lib/source_monitor/fetching/feed_fetcher*` | 4 files inspected, 0 offenses |
|
|
52
|
-
|
|
53
|
-
## Success Criteria
|
|
54
|
-
|
|
55
|
-
- [x] FeedFetcher main file under 300 lines (285, down from 627)
|
|
56
|
-
- [x] Three sub-modules created: source_updater.rb, adaptive_interval.rb, entry_processor.rb
|
|
57
|
-
- [x] Public API unchanged -- FeedFetcher.new(source:).call returns Result struct
|
|
58
|
-
- [x] All existing tests pass without modification (64 runs, 0 failures)
|
|
59
|
-
- [x] Full test suite passes (760 runs, 0 failures)
|
|
60
|
-
- [x] RuboCop passes on all modified/new files
|
|
61
|
-
- [x] REQ-08 satisfied
|