Skip to content

Add release validator and regression tracking - #590

Merged
neSpecc merged 19 commits into
masterfrom
feat/release-validator-worker
Oct 14, 2026
Merged

neSpecc merged 19 commits into
masterfrom
feat/release-validator-worker

Conversation

@alisawavezen12

@alisawavezen12 alisawavezen12 commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Introduce release-based detection of likely fixed events and track regressions when resolved events occur again.

Changes

  • Add a scheduled release-validator worker.
  • Check unchecked releases between 24 hours and 30 days old.
  • Mark events with the first eligible resolvedInRelease.
  • Store release names directly on new repetitions.
  • Track regressionInRelease for occurrences in the resolved or newer releases.
  • Support repeated resolution and regression cycles.
  • Add tests for validation, grouping, release maps, and regression scenarios.

@codex-assistant

Copy link
Copy Markdown

Please add a PR description 🙂

Respect the reviewers — a description helps others understand the changes and review them faster. Keep it short, clear, and to the point. It also serves as documentation for future reference.

The PR was moved to Draft until a description is added.

@codex-assistant

Copy link
Copy Markdown

Please add a PR description 🙂

Respect the reviewers — a description helps others understand the changes and review them faster. Keep it short, clear, and to the point. It also serves as documentation for future reference.

The PR was moved to Draft until a description is added.

@codex-assistant

Copy link
Copy Markdown

Please add a PR description 🙂

Respect the reviewers — a description helps others understand the changes and review them faster. Keep it short, clear, and to the point. It also serves as documentation for future reference.

The PR was moved to Draft until a description is added.

@codex-assistant

Copy link
Copy Markdown

Please add a PR description 🙂

Respect the reviewers — a description helps others understand the changes and review them faster. Keep it short, clear, and to the point. It also serves as documentation for future reference.

The PR was moved to Draft until a description is added.

@alisawavezen12 alisawavezen12 changed the title Add release validator worker Add release validator and regression tracking Sep 18, 2026
@codex-assistant

Copy link
Copy Markdown

Please add a PR description 🙂

Respect the reviewers — a description helps others understand the changes and review them faster. Keep it short, clear, and to the point. It also serves as documentation for future reference.

The PR was moved to Draft until a description is added.

@codex-assistant
codex-assistant Bot marked this pull request as ready for review September 18, 2026 15:25
@codex-assistant

Copy link
Copy Markdown

Thanks for adding a description — the PR is now marked as Ready for Review.

Comment thread workers/grouper/src/index.ts Outdated
return this.saveRepetition(task.projectId, newRepetition);
});

if (task.payload.release && existedEvent.resolvedInRelease) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

we need to check if task.payload.release is newer than existedEvent.resolvedInRelease

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

we do this later in the markRegression function.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

then we need to rename markRegression to checkForRegression

Comment thread workers/release-validator/src/utils/build-event-release-map.ts Outdated
Comment thread workers/release-validator/src/validate-releases.ts Outdated
Comment thread workers/release-validator/src/validate-releases.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot review overview

🟡 Changes recommended

Release history compatibility, durable regression reconciliation, deployment wiring, and bounded database processing remain unresolved.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 3 High severity · 1 Medium severity

Open (4)
What changed in this PR

Implements release-based event resolution and regression tracking across the validator and grouper workers.

Changes:

  • Adds release validation logic and worker scaffolding.
  • Records repetition releases and regression cycles.
  • Adds supporting tests and updates shared types.
File Description
yarn.lock Updates Hawk types dependency.
workers/​release-validator/​tests/​validate-releases.test.ts Tests release validation scenarios.
workers/​release-validator/​tests/​utils/​group-releases-by-project.test.ts Tests release grouping.
workers/​release-validator/​tests/​utils/​build-event-release-map.test.ts Tests event-release mapping.
workers/​release-validator/​tests/​index.test.ts Tests worker queue configuration.
workers/​release-validator/​src/​validate-releases.ts Implements release validation.
workers/​release-validator/​src/​utils/​group-releases-by-project.ts Groups releases by project.
workers/​release-validator/​src/​utils/​build-event-release-map.ts Maps events to releases.
workers/​release-validator/​src/​index.ts Defines the validator worker.
workers/​release-validator/​README.md Documents worker behavior.
workers/​release-validator/​package.json Declares worker metadata.
workers/​grouper/​tests/​index.test.ts Tests repetition and regression behavior.
workers/​grouper/​src/​mark-regression.ts Implements regression updates.
workers/​grouper/​src/​index.ts Records releases and invokes regression tracking.
package.json Adds scripts and updates types.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread package.json
Comment thread workers/grouper/src/index.ts
Comment thread workers/release-validator/src/utils/build-event-release-map.ts
Comment thread workers/release-validator/src/validate-releases.ts Outdated
Comment thread workers/grouper/src/mark-regression.ts Outdated
}

/**
* Mark a resolved event as regressed in the resolved or a newer release.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
* Mark a resolved event as regressed in the resolved or a newer release.
* Mark a resolved event as regressed if ...

Comment thread workers/grouper/src/mark-regression.ts Outdated
@@ -0,0 +1,67 @@
import { Db, ObjectID } from 'mongodb';

interface ReleaseRecord {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
interface ReleaseRecord {
type ReleaseRecordPart = Pick<ReleaseDBScheme, '_id' | 'projectId' | 'release'>

const hasRegressionForCurrentCycle = previousRegressionRelease &&
previousRegressionRelease._id.toHexString() >= resolvedReleaseId;

if (!isResolvedOrNewerRelease || hasRegressionForCurrentCycle) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

documentation needed

Comment thread workers/grouper/tests/index.test.ts Outdated
expect((await eventsCollection.findOne({})).regressionInRelease).toBe('release-c');
});

test('Should mark a resolved event as regressed in the resolved release', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
test('Should mark a resolved event as regressed in the resolved release', async () => {
test('Should mark as regressed ff we later encounter this event with a release that is considered a resolving release.', async () => {

Comment thread workers/grouper/tests/index.test.ts Outdated
expect(savedRepetition.release).toBeUndefined();
});

test('Should mark a resolved event as regressed in a newer repetition release', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

lets wrap them into describe('Regression marking, ...`

releasesByName: Map<string, ReleaseDBScheme>
): Promise<void> {
const eventGroupHashes = events.map(event => event.groupHash);
const repetitions = await repetitionsCollection.find({

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this seems to be deadly big. You're getting all millions of repetitions.
You need to retrieve only distinct "release" variations of each event.

Comment on lines +106 to +107
* For a regressed event, continue validation from the regression release
* instead of its original release. This enables repeated resolve cycles.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Docs seems unlcear to me. What is "repeated resolve cycles"?

return projectRelease._id.toHexString() > releaseId && releasesWithEvent.has(projectRelease.release);
});

if (!isNewerThanLastOccurrence || occurredInRelease || occurredInNewerRelease) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

doc is missing

continue;
}

/**

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

describe the logic first, then technical notes

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

redundant test

Comment thread workers/release-validator/src/validate-releases.ts Outdated
Comment thread workers/release-validator/src/validate-releases.ts Outdated
const repetitions = await repetitionsCollection.aggregate<Pick<RepetitionDBScheme, 'groupHash' | 'release'>>([
{
$match: {
groupHash: { $in: eventGroupHashes },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Maybe we should add { groupHash: 1, release: 1 } index to avoid excessive data reading when we need distinct releases only?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This needs a migration for existing projects and an API change for new projects. The current code works with the existing groupHash index, I think we can move this optimization to next pr

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we have appropriate board to track this task? I've seen this and this, but it seems abandoned.

Comment thread workers/grouper/src/index.ts Outdated
Comment thread workers/release-validator/src/validate-releases.ts
Reversean
Reversean previously approved these changes Oct 11, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Incomplete or archived release history and stale concurrent state can produce false resolutions or permanently missed regressions.

2 open findings
4 resolved since last review

🧠 Review effort: Balanced

Comment thread workers/release-validator/src/validate-releases.ts
Comment thread workers/grouper/src/check-and-mark-regression.ts
neSpecc
neSpecc previously approved these changes Oct 14, 2026
* limits and prevents large projects from loading all events and repetitions
* into worker memory at once.
*/
const EVENTS_BATCH_SIZE = 500;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
const EVENTS_BATCH_SIZE = 500;
const EVENTS_BATCH_SIZE = 50;

@alisawavezen12
alisawavezen12 dismissed stale reviews from neSpecc and Reversean via 4ac83dc October 14, 2026 14:40
@neSpecc
neSpecc merged commit 84e0d93 into master Oct 14, 2026
5 checks passed
@neSpecc
neSpecc deleted the feat/release-validator-worker branch October 14, 2026 15:41
alisawavezen12 added a commit that referenced this pull request Oct 14, 2026
* fix(grouper): fix some ts errors (#581)

* Use dailyEvents counter for all workspaces in limiter (#584)

* Stop limiter from opening every events collection each hour (#587)

* Stop limiter from opening every events collection each hour

* Comment limiter dailyEvents aggregation sections

* Report sampled limiter counter validation to Telegram

* Compare old and new limiter algo for listed workspaces instead of sampling

* Use the previous dailyEvents query for old algo comparison

* Remove old limiter algo comparison (#591)

* Exit runner when a worker fails to start (#594)

* Add release validator and regression tracking (#590)

* Add release validator worker

* Track event regressions by release

* chore

* Support repeated resolution and regression cycles

* validate Events Batch

* Add release validator to Docker Compose

* chore

* chore

* chore

* chore

* Align release validation with retention policy

Use MAX_DAYS_NUMBER to define the candidate release window and fall
back to event timestamps when original release records are archived.

* Isolate release validation failures by project

* Clear regression when resolving event again

* Track latest event occurrence before validation

* tests fix

* chore

* chore

---------

Co-authored-by: Peter <specc.dev@gmail.com>
Co-authored-by: Kuchizu <70284260+Kuchizu@users.noreply.github.com>
Co-authored-by: alisawavezen12 <dobruniaqwerty@gmail.com>
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.

4 participants