Skip to content

Feat/phase4 fe postgres - #19

Merged
ravin00 merged 35 commits into
mainfrom
feat/phase4-fe-postgres
Aug 7, 2026
Merged

Feat/phase4 fe postgres#19
ravin00 merged 35 commits into
mainfrom
feat/phase4-fe-postgres

Conversation

@ravin00

@ravin00 ravin00 commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Summary

  • Introduce IStateVectorPublisher strategy: PostgresStateWriter
    (Dapper + Npgsql, BYTEA blob, schema init on boot) as the active
    implementation, AzureMlFeatureStorePublisher as a Phase-8 stub.
  • Add StateVectorEmitterService — 60s BackgroundService that iterates
    WindowStore.Workloads and persists a vector per workload per tick.
  • Wire Postgres reachability into /health: the standard AddNpgSql
    check plus gating FeatureEngineeringHealthCheck on
    !PostgresReachable.
  • Connection string is not committed. appsettings.json omits
    PostgresConnectionString; dev sourcing is dotnet user-secrets,
    prod sourcing (PR 6) is a Kubernetes Secret via env var. Program.cs
    fails fast at boot with a message pointing developers to the right
    setup command.
  • docs/development.md gains a "Local Postgres for Feature Engineering"
    section documenting the one-time User Secrets setup.
  • New packages: Npgsql 8.0.3, Dapper 2.1.35,
    AspNetCore.HealthChecks.NpgSql 8.0.1 (runtime);
    Testcontainers.PostgreSql 3.10.0 (tests only).

Design notes

  • Fail-hard on boot if Postgres is unreachable — a clear crash beats a
    broken emitter loop. The K8s init container in PR 6 gates FE on
    pg_isready so this is safe in-cluster.
  • NpgsqlDataSource singleton uses built-in pooling; no per-write
    connection creation.
  • Vector serialised as little-endian float32 (188 bytes) with a schema
    CHECK; matches how the Phase 5 Python trainer will np.frombuffer.
  • No credential-shaped values touch the repo; secrets are injected at
    runtime (User Secrets in dev, Kubernetes Secret in prod).

Test plan

  • dotnet build AFIE.slnx — clean (one pre-existing xUnit2013
    warning in the PR 3 test, unrelated)
  • dotnet test AFIE.slnx — 63 passing (20 telemetry + 43 FE,
    requires Docker for Testcontainers)
  • Missing-config smoke: remove the User Secret and run — service
    exits with the "not configured" message
  • Local smoke against docker run postgres:16-alpine: append a
    MetricEvent to today's JSONL; after 60s, state_vectors has ≥1
    row with octet_length(vector)=188
  • /health shows both feature-engineering and postgres Healthy;
    stateVectorsWrittenTotal >= 1

CI note

Testcontainers requires Docker on the runner. Ensure docker-in-docker
availability or the equivalent GitHub Actions service. CI needs no
secret injection for the tests themselves — Testcontainers spins up its
own ephemeral Postgres per test class.

Summary by CodeRabbit

  • New Features

    • Added PostgreSQL-backed state-vector publishing with configurable emission intervals.
    • Added startup validation, readiness checks, health reporting, and periodic background publishing.
    • Added Kubernetes deployment, service, health probes, and secret configuration guidance.
    • Added local PostgreSQL setup and development documentation.
  • Bug Fixes

    • Health status now reports PostgreSQL connectivity failures as degraded.
  • Tests

    • Added integration coverage for persistence, serialization, health updates, connection failures, and configuration validation.

ravin00 added 18 commits August 6, 2026 13:10
@ravin00
ravin00 requested a lite review from Copilot and removed request for Copilot August 6, 2026 14:55
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The feature-engineering service now validates publisher settings, initializes a PostgreSQL publisher, emits state vectors in the background, exposes PostgreSQL health status, and provides Kubernetes deployment resources with integration and options-validation tests.

Changes

Feature-engineering publishing

Layer / File(s) Summary
Repository and service configuration
.claude/rules/CLAUDE.md, .gitignore, docs/development.md, src/api/feature-engineering/..., tests/AFIE.FeatureEngineering.Tests/...
Adds repository rules, ignore patterns, PostgreSQL setup guidance, publisher settings, validated emission options, and related validation tests.
Publisher contract and startup wiring
src/api/feature-engineering/Publishers/..., src/api/feature-engineering/Program.cs, src/api/feature-engineering/Health/...
Adds publisher selection, PostgreSQL data-source registration, readiness initialization, health endpoints, PostgreSQL health reporting, and an explicit Azure ML placeholder.
PostgreSQL persistence and integration coverage
src/api/feature-engineering/Publishers/PostgresStateWriter.cs, tests/AFIE.FeatureEngineering.Tests/Publishers/...
Creates the PostgreSQL schema, serializes and stores state vectors, updates health metrics, and tests schema creation, round-trip storage, counters, and connection failures.
Background state-vector emission
src/api/feature-engineering/Services/StateVectorEmitterService.cs
Adds a cancellable background loop that snapshots workloads, builds vectors, publishes results, and logs per-workload failures.
Kubernetes deployment wiring
infra/gitops/manifests/feature-engineering-deployment.yaml, infra/gitops/manifests/feature-engineering-secret.example
Adds the feature-engineering Deployment, ClusterIP Service, PostgreSQL environment configuration, probes, resource settings, experiments volume, and Secret template.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant FeatureEngineeringService
  participant StateVectorEmitterService
  participant PostgresStateWriter
  participant PostgreSQL
  FeatureEngineeringService->>PostgresStateWriter: EnsureReadyAsync
  StateVectorEmitterService->>PostgresStateWriter: PublishAsync(StateVector)
  PostgresStateWriter->>PostgreSQL: Insert vector bytes and metadata
  PostgreSQL-->>PostgresStateWriter: Persisted result
Loading

Possibly related PRs

  • ravin00/AFIE#16: Introduces entities that this PR extends with PostgreSQL publishing and emission functionality.
  • ravin00/AFIE#17: Shares feature-engineering configuration, startup, and health-check changes.
  • ravin00/AFIE#18: Introduces configuration and startup wiring extended by this PR.

Suggested reviewers: dinuda

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the Phase 4 feature-engineering PostgreSQL work and matches the main changes in the pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/phase4-fe-postgres

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (4)
tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs (1)

58-66: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Verify the stored vector bytes, not only the byte length.

This test passes if all 188 bytes have the wrong byte order or wrong values. Read vector as byte[] and assert the expected little-endian float32 representation for the sample values.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs`
around lines 58 - 66, Update PublishAsync_RoundTrip_VectorIs188Bytes to read the
stored vector column as byte[] rather than only querying octet_length, then
assert it matches the expected little-endian float32 byte representation
produced by SampleVector().
docs/development.md (1)

57-61: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the redundant User Secrets initialization step.

AFIE.FeatureEngineering.csproj already defines <UserSecretsId> at Line 6. Keep the dotnet user-secrets set command, or make initialization conditional for older checkouts. Official .NET guidance uses init only when the project has not already been initialized. (learn.microsoft.com)

Proposed documentation change
-dotnet user-secrets init --project src/api/feature-engineering
 dotnet user-secrets set "FeatureEngineering:PostgresConnectionString" \
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/development.md` around lines 57 - 61, Remove the redundant `dotnet
user-secrets init` command from the documented setup steps, since
`AFIE.FeatureEngineering.csproj` already defines `UserSecretsId`; retain the
`dotnet user-secrets set` command unchanged.
.gitignore (1)

232-241: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Keep .terraform.lock.hcl tracked.

Line 236 ignores Terraform’s dependency lock file. Unlike .terraform/ and *.tfstate, this file records provider selections and checksums. Terraform guidance recommends reviewing and committing it with the root configuration. (developer.hashicorp.com)

Proposed diff
- .terraform.lock.hcl
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gitignore around lines 232 - 241, Remove the .terraform.lock.hcl entry from
the Terraform ignore rules in .gitignore, while keeping the other generated
Terraform artifacts ignored.
.claude/rules/CLAUDE.md (1)

47-54: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Keep the health-check rule and implementation consistent.

FeatureEngineeringHealthCheck still calculates staleness from TelemetryScrapeIntervalSeconds and StalenessMultiplier constants. It does not read these thresholds from IOptions<T>. Add validated threshold options and rejection tests, or change this rule to document that the constants are intentional.

As per coding guidelines, thresholds must come from IOptions<T> and must not use magic constants.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/rules/CLAUDE.md around lines 47 - 54, Update the health-check rule
and FeatureEngineeringHealthCheck implementation to obtain staleness thresholds
through validated IOptions<T> settings instead of TelemetryScrapeIntervalSeconds
and StalenessMultiplier constants. Add rejection tests covering invalid
threshold values, and ensure the documented contract reflects the options-backed
behavior.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/api/feature-engineering/appsettings.json`:
- Around line 17-18: Validate FeatureEngineeringOptions.EmitIntervalSeconds in
its constructor so zero and negative values are rejected before
StateVectorEmitterService starts; ensure hosted-service startup cannot proceed
with an invalid interval, and add tests covering both 0 and negative values.
- Around line 17-18: Add the production deployment secret and Argo-syncable
manifest or deployment configuration for
FeatureEngineering__PostgresConnectionString, ensuring it is available before
service startup when PublisherMode is postgres. Use the existing production
PostgreSQL secret/configuration conventions and preserve the current appsettings
defaults.

In `@src/api/feature-engineering/Models/FeatureEngineeringOptions.cs`:
- Line 18: Enforce that FeatureEngineeringOptions.EmitIntervalSeconds is
strictly positive during options binding/validation, rejecting zero and negative
values before the host starts. Add the appropriate options validation metadata
or validator to FeatureEngineeringOptions and ensure it is registered for
startup validation; StateVectorEmitterService requires no direct change because
it should continue consuming the validated value at its existing Task.Delay
call.

In `@src/api/feature-engineering/Program.cs`:
- Around line 44-48: Update src/api/feature-engineering/Program.cs lines 44-48
to explicitly accept only supported PublisherMode values, failing startup for
azureml until its persistence is implemented and for unknown values instead of
defaulting to Postgres. Update
src/api/feature-engineering/Publishers/AzureMlFeatureStorePublisher.cs lines
11-17 so its readiness and publishing methods do not report success or complete
successfully without actual Azure ML persistence.

In `@src/api/feature-engineering/Publishers/PostgresStateWriter.cs`:
- Around line 76-80: Update the exception handling in PublishAsync around the
Postgres INSERT: keep setting _health.PostgresReachable to false and logging the
error, rethrow cancellation exceptions unchanged to preserve cancellation, and
rethrow other failures so StateVectorEmitterService records the workload as
failed instead of counting it as emitted.
- Around line 60-61: The vector serialization in PostgresStateWriter must
produce pgvector BYTEA format rather than platform-native bytes: update the
conversion before binding `@Vector` to encode float32 values in PostgreSQL network
byte order and include the required 4-byte header. In
tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs lines
58-66, extend PublishAsync_RoundTrip_VectorIs188Bytes to assert both the stored
length and exact byte content/order for known float values.

---

Nitpick comments:
In @.claude/rules/CLAUDE.md:
- Around line 47-54: Update the health-check rule and
FeatureEngineeringHealthCheck implementation to obtain staleness thresholds
through validated IOptions<T> settings instead of TelemetryScrapeIntervalSeconds
and StalenessMultiplier constants. Add rejection tests covering invalid
threshold values, and ensure the documented contract reflects the options-backed
behavior.

In @.gitignore:
- Around line 232-241: Remove the .terraform.lock.hcl entry from the Terraform
ignore rules in .gitignore, while keeping the other generated Terraform
artifacts ignored.

In `@docs/development.md`:
- Around line 57-61: Remove the redundant `dotnet user-secrets init` command
from the documented setup steps, since `AFIE.FeatureEngineering.csproj` already
defines `UserSecretsId`; retain the `dotnet user-secrets set` command unchanged.

In `@tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs`:
- Around line 58-66: Update PublishAsync_RoundTrip_VectorIs188Bytes to read the
stored vector column as byte[] rather than only querying octet_length, then
assert it matches the expected little-endian float32 byte representation
produced by SampleVector().
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 86132008-b881-48cf-a601-d2cf428d86b8

📥 Commits

Reviewing files that changed from the base of the PR and between 474c368 and 5b860a4.

📒 Files selected for processing (15)
  • .claude/rules/CLAUDE.md
  • .gitignore
  • docs/development.md
  • src/api/feature-engineering/AFIE.FeatureEngineering.csproj
  • src/api/feature-engineering/Health/FeatureEngineeringHealthCheck.cs
  • src/api/feature-engineering/Models/FeatureEngineeringOptions.cs
  • src/api/feature-engineering/Program.cs
  • src/api/feature-engineering/Publishers/AzureMlFeatureStorePublisher.cs
  • src/api/feature-engineering/Publishers/IStateVectorPublisher.cs
  • src/api/feature-engineering/Publishers/PostgresStateWriter.cs
  • src/api/feature-engineering/Services/StateVectorEmitterService.cs
  • src/api/feature-engineering/appsettings.json
  • src/api/feature-engineering/experiments/state/fe_consumer_offset.json
  • tests/AFIE.FeatureEngineering.Tests/AFIE.FeatureEngineering.Tests.csproj
  • tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs
💤 Files with no reviewable changes (1)
  • src/api/feature-engineering/experiments/state/fe_consumer_offset.json

Comment thread src/api/feature-engineering/appsettings.json
Comment thread src/api/feature-engineering/Models/FeatureEngineeringOptions.cs
Comment thread src/api/feature-engineering/Program.cs Outdated
Comment thread src/api/feature-engineering/Publishers/PostgresStateWriter.cs
Comment thread src/api/feature-engineering/Publishers/PostgresStateWriter.cs
@ravin00
ravin00 requested a review from Dinuda August 6, 2026 15:14
Copilot AI lite review requested due to automatic review settings August 6, 2026 17:52
@ravin00
ravin00 removed the request for review from Copilot August 6, 2026 17:58

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/api/feature-engineering/Services/StateVectorEmitterService.cs (1)

57-68: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Propagate PostgreSQL write failures.

PostgresStateWriter.PublishAsync catches insert exceptions and returns normally. Line 59 then increments emitted, and Line 68 logs a successful emission for a vector that PostgreSQL did not store.

Update PostgresStateWriter.PublishAsync to update health state, log the failure, and rethrow. Also rethrow OperationCanceledException so shutdown can stop pending emissions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/api/feature-engineering/Services/StateVectorEmitterService.cs` around
lines 57 - 68, Update PostgresStateWriter.PublishAsync so PostgreSQL insert
failures update the health state, log the exception, and rethrow instead of
returning normally; also propagate OperationCanceledException unchanged so
cancellation reaches the emission loop. Keep StateVectorEmitterService’s emitted
count and success logging dependent on PublishAsync completing successfully.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@infra/gitops/manifests/feature-engineering-deployment.yaml`:
- Around line 66-71: Replace the emptyDir backing the feature-engineering-data
volume in the feature-engineering deployment with the shared persistent storage
used by the result producer, ensuring it is mounted at /app/experiments and
retains both producer results and consumer offset state across pod restarts.
- Around line 47-58: Update the livenessProbe configuration to use the
process-only health endpoint instead of the PostgreSQL-gated /health path, while
preserving /health for readinessProbe and any startup probe configuration.
- Around line 17-68: Harden the feature-engineering Deployment by configuring
pod and container securityContext values for non-root execution, disabled
privilege escalation, dropped Linux capabilities, and a read-only root
filesystem. Update the image used by the feature-engineering container to run as
a non-root user, and add explicit writable emptyDir volumes and mounts for the
required /app/experiments paths while leaving the rest of the filesystem
read-only.

In `@infra/gitops/manifests/feature-engineering-secret.example.yaml`:
- Around line 9-11: Exclude the feature-engineering Secret template from Argo
reconciliation by renaming feature-engineering-secret.example.yaml with a
non-manifest extension, moving it outside the recursively synced manifests
directory, or adding an explicit exclude in app-afie.yaml. Preserve the template
for reference while ensuring Argo cannot apply its REPLACE_ME values.

---

Outside diff comments:
In `@src/api/feature-engineering/Services/StateVectorEmitterService.cs`:
- Around line 57-68: Update PostgresStateWriter.PublishAsync so PostgreSQL
insert failures update the health state, log the exception, and rethrow instead
of returning normally; also propagate OperationCanceledException unchanged so
cancellation reaches the emission loop. Keep StateVectorEmitterService’s emitted
count and success logging dependent on PublishAsync completing successfully.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ecadacd3-6c56-42c8-8b74-f08b29ed907b

📥 Commits

Reviewing files that changed from the base of the PR and between 5b860a4 and 1cc40fb.

📒 Files selected for processing (4)
  • infra/gitops/manifests/feature-engineering-deployment.yaml
  • infra/gitops/manifests/feature-engineering-secret.example.yaml
  • src/api/feature-engineering/Services/StateVectorEmitterService.cs
  • tests/AFIE.FeatureEngineering.Tests/Services/StateVectorEmitterServiceTests.cs

Comment thread infra/gitops/manifests/feature-engineering-deployment.yaml
Comment thread infra/gitops/manifests/feature-engineering-deployment.yaml
Comment thread infra/gitops/manifests/feature-engineering-deployment.yaml
Comment thread infra/gitops/manifests/feature-engineering-secret.example.yaml Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
infra/gitops/manifests/feature-engineering-secret.example (1)

9-11: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Add an explicit Argo CD skip directive.

targeetRevision: main recurses under infra/gitops/manifests/. A future rename to .yaml would let Argo CD render this placeholder Secret and overwrite feature-engineering-secrets with REPLACE_ME values. Add # +argocd:skip-file-rendering so the file remains a template only, and keep the .example extension as a secondary safeguard.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@infra/gitops/manifests/feature-engineering-secret.example` around lines 9 -
11, Add the explicit # +argocd:skip-file-rendering directive to the
feature-engineering secret template, while preserving its .example extension and
existing explanatory comments.

Source: MCP tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/api/feature-engineering/Publishers/PostgresStateWriter.cs`:
- Around line 80-84: Validate vector.Values serializes to exactly 188 bytes
before the PostgreSQL insert in the surrounding write method, and reject invalid
payloads without entering the generic database exception handler. Keep
_health.PostgresReachable unchanged for this validation failure, while
preserving existing outage handling for actual PostgreSQL errors, and add
coverage for an invalid vector.

---

Nitpick comments:
In `@infra/gitops/manifests/feature-engineering-secret.example`:
- Around line 9-11: Add the explicit # +argocd:skip-file-rendering directive to
the feature-engineering secret template, while preserving its .example extension
and existing explanatory comments.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a091b872-cc6b-45c7-9e7c-6f98cdf8cdc0

📥 Commits

Reviewing files that changed from the base of the PR and between 1cc40fb and 3912b6e.

📒 Files selected for processing (9)
  • infra/gitops/manifests/feature-engineering-deployment.yaml
  • infra/gitops/manifests/feature-engineering-secret.example
  • src/api/feature-engineering/Models/FeatureEngineeringOptions.cs
  • src/api/feature-engineering/Program.cs
  • src/api/feature-engineering/Publishers/AzureMlFeatureStorePublisher.cs
  • src/api/feature-engineering/Publishers/PostgresStateWriter.cs
  • src/api/feature-engineering/Services/StateVectorEmitterService.cs
  • tests/AFIE.FeatureEngineering.Tests/Models/FeatureEngineeringOptionsValidationTests.cs
  • tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs
💤 Files with no reviewable changes (1)
  • src/api/feature-engineering/Services/StateVectorEmitterService.cs
🚧 Files skipped from review as they are similar to previous changes (3)
  • infra/gitops/manifests/feature-engineering-deployment.yaml
  • tests/AFIE.FeatureEngineering.Tests/Publishers/PostgresStateWriterTests.cs
  • src/api/feature-engineering/Models/FeatureEngineeringOptions.cs

Comment thread src/api/feature-engineering/Publishers/PostgresStateWriter.cs
@ravin00
ravin00 merged commit b5d87da into main Aug 7, 2026
1 check passed
@ravin00
ravin00 deleted the feat/phase4-fe-postgres branch August 7, 2026 14:12
@coderabbitai coderabbitai Bot mentioned this pull request Aug 10, 2026
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant