<feed xmlns='http://www.w3.org/2005/Atom'>
<title>phorge-elasticsearch-modern.git, branch development</title>
<subtitle>Phorge full-text search extension for Elasticsearch 7.x / 8.x / OpenSearch via the typeless API (mirror of https://github.com/vyos/phorge-elasticsearch-modern.git)
</subtitle>
<id>https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/atom?h=development</id>
<link rel='self' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/atom?h=development'/>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/'/>
<updated>2026-05-23T14:39:06+00:00</updated>
<entry>
<title>Merge production into development (forward-merge plumbing)</title>
<updated>2026-05-23T14:39:06+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T14:39:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=5a47a44b717a912bd22d7e03921521cfec49074e'/>
<id>urn:sha1:5a47a44b717a912bd22d7e03921521cfec49074e</id>
<content type='text'>
Brings the plumbing commits from production into development before
the v0.1.0 promotion PR (vyos/phorge-elasticsearch-modern#16) merges:

- 82fa1fd: PR vyos/phorge-elasticsearch-modern#13 plumbing merge (AGENTS.md, .coderabbit.yaml,
  .mergify.yml, .github/copilot-instructions.md symlink)
- ac5f615: symlink/Mergify config refinement
- f83781c: PR vyos/phorge-elasticsearch-modern#14 Mergify deprecation auto-update

Without this forward-merge, PR #16's diff would DELETE these
governance files from production. Caught by Codex adversarial review
on head SHA 3e8f4190.

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>Tests: refresh stale docblock after engine abstract→class revert</title>
<updated>2026-05-23T14:23:31+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T14:23:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=3e8f4190bf666133b59112e351071c8d92b77def'/>
<id>urn:sha1:3e8f4190bf666133b59112e351071c8d92b77def</id>
<content type='text'>
The class docblock still described the engine as abstract, from
before commit 011eec1 reverted 'abstract class' to plain 'class'.
Updated wording to accurately describe the concrete engine and the
test-double's role.

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>Engine: fix negative pagination bounds and _ts accumulation</title>
<updated>2026-05-23T14:16:51+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T14:16:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=e5fbde8bb9b21d264f71f25881b44db1af3d03c6'/>
<id>urn:sha1:e5fbde8bb9b21d264f71f25881b44db1af3d03c6</id>
<content type='text'>
Two correctness bugs surfaced by CR / Phase 0, both inherited from
the bundled PhabricatorElasticFulltextStorageEngine pattern:

1. executeSearch() did not validate that $offset / $limit were
   non-negative. PHP's (int) cast on a negative string yields a
   negative int, which would be passed unchecked to Elasticsearch.
   Add an explicit non-negative check before the existing upper-
   bound (offset + limit &gt; 10000) check.

2. reindexAbstractDocument()'s relationship-data loop assigned the
   '_ts' field unconditionally instead of accumulating. For multi-
   valued relationships (multiple authorPHID, projectPHID, etc.
   entries on the same doc), only the last timestamp survived.
   Change to array-append, parallel to the PHID array.

Both fixes diverge from the bundled engine; bundled retains the
faithful-but-broken behavior. Worth fixing in this extension since
we control the wire format.

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>Engine: revert abstract → plain class for production dispatch</title>
<updated>2026-05-23T12:48:18+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T12:48:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=011eec12f9176a6a8b8d8b9133bc00107a7855c0'/>
<id>urn:sha1:011eec12f9176a6a8b8d8b9133bc00107a7855c0</id>
<content type='text'>
A recent fixup cascade declared VyOSElasticModernFulltextStorageEngine
as 'abstract class' to enable test-doubling subclasses
(VyOSElasticModernHostTestEngine, VyOSElasticModernFulltextStorageEngineTestDouble).

That change broke production dispatch: Phorge's PhutilClassMapQuery
selects engines via PhutilSymbolLoader::loadObjects(), which calls
setConcreteOnly(true) and unsets any class where reflection reports
isAbstract(). The engine class would no longer be discoverable by
cluster.search[].type:elasticsearch-modern, and the test-fixture
subclasses live in src/__tests__/ which libphutil excludes from
runtime class-map loading.

Revert to plain 'class' (not 'final', not 'abstract'). Plain
'class' is discoverable by PhutilClassMapQuery; existing test
fixtures keep working without rewrite; operators can subclass if
they need to (harmless).

Also update VyOSElasticModernHostTestCase::testPlaceholderEngineIsAbstract
→ testEngineIsConcreteForDispatch, inverting the assertion to document
the correct invariant and its rationale (setConcreteOnly reference).

All 22 tests pass.

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>Address PR 16 CR findings</title>
<updated>2026-05-23T12:35:17+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T12:35:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=a19f5c077c0ed8ee4d88c0c8d704995b155d3dc2'/>
<id>urn:sha1:a19f5c077c0ed8ee4d88c0c8d704995b155d3dc2</id>
<content type='text'>
- README cluster.search example uses 'phabricator/' to match host
  default (was '/phabricator'; both work for index name but the
  host uses path verbatim for the base URI).
- Add VERIFICATION.md placeholder with the planned smoke-test matrix
  template; status notes v0.1.0 is pending IS-474.
- Engine reindex: replace 'if ($time)' falsy check with 'if ($time
  !== null)' so a Unix epoch timestamp (0) is not silently dropped.

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>fix: correct Phase-0 findings from promotion PR review (3 issues)</title>
<updated>2026-05-23T12:14:02+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T12:14:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=4d27ac74aff1ca47db53510bf07e9d083635175b'/>
<id>urn:sha1:4d27ac74aff1ca47db53510bf07e9d083635175b</id>
<content type='text'>
1. TestDouble signatures: indexExists() and getIndexStats() in
   VyOSElasticModernFulltextStorageEngineTestDouble were missing the
   nullable host parameter added in E7/E8, causing a PHP fatal on
   'arc unit --everything'.

2. buildSpec() zero-query sort bug: the falsy check
   (!$query-&gt;getParameter('query')) incorrectly treats the string '0'
   as empty (PHP falsy), enabling date-sorted path for a real search
   term. Changed to explicit null/empty-string checks to match the
   existing must-clause guard on line 316.

All 22 unit tests now pass.

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>fix: use correct HTTPFutureResponseStatus in indexExists() catch clause</title>
<updated>2026-05-23T12:08:18+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@vyos.io</email>
</author>
<published>2026-05-23T12:08:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=e36bce7dee75eccf67ae4737452275a6a01d7bb9'/>
<id>urn:sha1:e36bce7dee75eccf67ae4737452275a6a01d7bb9</id>
<content type='text'>
Phase 0 CodeRabbit caught a typo — HTTPFutureHTTPResponseStatus does not
exist in the libphutil type hierarchy; the correct class is
HTTPFutureResponseStatus (consistent with line 257 in executeRequest()).

🤖 Generated by [robots](https://vyos.io)
</content>
</entry>
<entry>
<title>Merge pull request #12 from vyos/task/d1-readme</title>
<updated>2026-05-23T11:24:14+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@andamasov.com</email>
</author>
<published>2026-05-23T11:24:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=5dcca86551f1d2a0f8b96bff5a5aa84573c14dce'/>
<id>urn:sha1:5dcca86551f1d2a0f8b96bff5a5aa84573c14dce</id>
<content type='text'>
D1: Full README with install, migration, limitations</content>
</entry>
<entry>
<title>Merge pull request #11 from vyos/task/e8-search-lifecycle</title>
<updated>2026-05-23T11:24:02+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@andamasov.com</email>
</author>
<published>2026-05-23T11:24:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=9a4794797ddceca944ac510b12950bb1208dd117'/>
<id>urn:sha1:9a4794797ddceca944ac510b12950bb1208dd117</id>
<content type='text'>
E8: Wire executeSearch, index lifecycle, buildSpec</content>
</entry>
<entry>
<title>Merge pull request #10 from vyos/task/e7-reindex</title>
<updated>2026-05-23T11:23:50+00:00</updated>
<author>
<name>Yuriy Andamasov</name>
<email>yuriy@andamasov.com</email>
</author>
<published>2026-05-23T11:23:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/vyos/phorge-elasticsearch-modern.git/commit/?id=56681d40abb677ebabc68d7ad61fc666f8a0838d'/>
<id>urn:sha1:56681d40abb677ebabc68d7ad61fc666f8a0838d</id>
<content type='text'>
E7: Add reindexAbstractDocument() + executeRequest()</content>
</entry>
</feed>
